Leetcode—2530.执行K次操作后的最大分数【中等】(C语言向上取整数学公式)

这篇具有很好参考价值的文章主要介绍了Leetcode—2530.执行K次操作后的最大分数【中等】(C语言向上取整数学公式)。希望对大家有所帮助。如果存在错误或未考虑完全的地方,请大家不吝赐教,您也可以点击"举报违法"按钮提交疑问。

2023每日刷题(五)

Leetcode—2530.执行K次操作后的最大分数

Leetcode—2530.执行K次操作后的最大分数【中等】(C语言向上取整数学公式),LeetCode刷题,c语言,算法,leetcode,经验分享,最大堆

向上取整思想

参考了这篇文章
Leetcode—2530.执行K次操作后的最大分数【中等】(C语言向上取整数学公式),LeetCode刷题,c语言,算法,leetcode,经验分享,最大堆
有人肯定会问,这个向上取整为什么是这样来的。接下来我简单讲解一下。

数学式: x y 数学式:\frac{x}{y} 数学式:yx有以下两种情况

  • x能整除y,则 x y \frac{x}{y} yx就是向上取整和向下取整结果一致的情况,不需要额外转换。也就是说 x y \frac{x}{y} yx的向上取整和向下取整都是它本身,例如 6 3 = 2 \frac{6}{3}=2 36=2 6 3 \frac{6}{3} 36向下取整和向上取整结果都一样,即为2
  • x不能整除y,则 x y \frac{x}{y} yx是向下取整结果,不符合我们的需求。例如 5 2 = 2 \frac{5}{2}=2 25=2,但是我们需要它的向上取整的值,就不能直接用/。

解释一下 ( x + y − 1 ) / y (x + y - 1) / y (x+y1)/y

  • 如果x能整除y,那么 ( x + y − 1 ) / y (x + y - 1) / y (x+y1)/y的结果就等价于 x / y x / y x/y,例如 6 3 = 2 \frac{6}{3}=2 36=2
  • 如果x不能整除y,那么 ( x + y − 1 ) / y (x + y - 1) / y (x+y1)/y结果就是向上取整的值。例如 x = 5 , y = 2 x=5,y=2 x=5,y=2,则 ( 5 + 2 − 1 ) / 2 = 3 (5 + 2 - 1) / 2 = 3 (5+21)/2=3,即为 5 2 \frac{5}{2} 25向上取整的值。

你也可以这么理解,

  • 若x能整除y,例如x=2y,所以向上整除为2
  • 若x不能整除y,例如x=2y+1,也可以是 [ 2 y + 1 , 3 y ) \left[2y+1, 3y\right) [2y+1,3y),所以 ( x + y − 1 ) / y = ( 2 y + 1 + y − 1 ) = 3 (x + y - 1) / y = (2y + 1 + y - 1) = 3 (x+y1)/y=(2y+1+y1)=3

直接法实现代码

void max(int *nums, int numsSize, int *e) {
    int i = 0;
    int max = nums[0];
    int cnt = 0;
    for(i = 1; i < numsSize; i++) {
        if(max < nums[i]) {
            max = nums[i];
            cnt = i;
        }
    }
    *e = cnt;
}

long long maxKelements(int* nums, int numsSize, int k){
    int i = 0;
    long long ans = 0;
    int cur = 0;
    for(; i < k; i++) {
        max(nums, numsSize, &cur);
        ans += nums[cur];
        nums[cur] = (nums[cur] + 2) / 3;
    }
    return ans;
}

测试结果

Leetcode—2530.执行K次操作后的最大分数【中等】(C语言向上取整数学公式),LeetCode刷题,c语言,算法,leetcode,经验分享,最大堆
因为我的时间复杂度太大了,即 O ( k n ) O(kn) O(kn),主要是也没要求时间复杂度啊。。。接下来用最大堆的方法做,也就是大根堆

最大堆实现代码

void swap(int *a, int *b) {
    int tmp = *a;
    *a = *b;
    *b = tmp;
}

void downAdjustHeap(int* heap, int low, int high) {
    // 相当于双亲为i,左孩子为2*i+1,右孩子为2*i+2,因为这里数组从下标0开始
    int i = low, j = i * 2 + 1;
    while(j <= high) {
        if(j + 1 <= high && heap[j + 1] > heap[j]) {
            j = j + 1;
        }
        if(heap[j] > heap[i]) {
            swap(&heap[j], &heap[i]);
            i = j;
            j = j * 2 + 1;
        } else {
            break;
        }
    }
}

void createHeap(int* arr, int n) {
    // 建立大顶堆
    int i;
    for(i = n / 2 - 1; i >= 0; i--) {
        downAdjustHeap(arr, i, n - 1);
    }
}

long long maxKelements(int* nums, int numsSize, int k){
    // 建立大顶堆,即最大堆
    createHeap(nums, numsSize);
    long long ans = 0;
    int i;
    for(i = 0; i < k; i++) {
        ans += nums[0];
        // 向上取整
        nums[0] = (nums[0] + 2) / 3;
        downAdjustHeap(nums, 0, numsSize - 1);
    }
    return ans;
}

Leetcode—2530.执行K次操作后的最大分数【中等】(C语言向上取整数学公式),LeetCode刷题,c语言,算法,leetcode,经验分享,最大堆

测试结果

Leetcode—2530.执行K次操作后的最大分数【中等】(C语言向上取整数学公式),LeetCode刷题,c语言,算法,leetcode,经验分享,最大堆
之后我会持续更新,如果喜欢我的文章,请记得一键三连哦,点赞关注收藏,你的每一个赞每一份关注每一次收藏都将是我前进路上的无限动力 !!!↖(▔▽▔)↗感谢支持!文章来源地址https://www.toymoban.com/news/detail-722422.html

到了这里,关于Leetcode—2530.执行K次操作后的最大分数【中等】(C语言向上取整数学公式)的文章就介绍完了。如果您还想了解更多内容,请在右上角搜索TOY模板网以前的文章或继续浏览下面的相关文章,希望大家以后多多支持TOY模板网!

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处: 如若内容造成侵权/违法违规/事实不符,请点击违法举报进行投诉反馈,一经查实,立即删除!

领支付宝红包 赞助服务器费用

相关文章

  • LeetCode、2542. 最大子序列的分数【中等,排序+小顶堆】

    博主介绍:✌目前全网粉丝2W+,csdn博客专家、Java领域优质创作者,博客之星、阿里云平台优质作者、专注于Java后端技术领域。 涵盖技术内容:Java后端、算法、分布式微服务、中间件、前端、运维、ROS等。 博主所有博客文件目录索引:博客目录索引(持续更新) 视频平台:

    2024年01月18日
    浏览(44)
  • C++深度优先搜索的应用:在树上执行操作以后得到的最大分数

    深度优先搜索(DFS) 有一棵 n 个节点的无向树,节点编号为 0 到 n - 1 ,根节点编号为 0 。给你一个长度为 n - 1 的二维整数数组 edges 表示这棵树,其中 edges[i] = [ai, bi] 表示树中节点 ai 和 bi 有一条边。 同时给你一个长度为 n 下标从 0 开始的整数数组 values ,其中 values[i] 表示第

    2024年02月05日
    浏览(44)
  • leetcode:2011. 执行操作后的变量值(python3解法)

    存在一种仅支持 4 种操作和 1 个变量  X  的编程语言: ++X  和  X++  使变量  X  的值  加   1 --X  和  X--  使变量  X  的值  减   1 最初, X  的值是  0 给你一个字符串数组  operations  ,这是由操作组成的一个列表,返回执行所有操作后,   X  的  最终值  。 示例 1:

    2024年02月11日
    浏览(42)
  • 【LeetCode-中等】221. 最大正方形(详解)

    在一个由  \\\'0\\\'  和  \\\'1\\\'  组成的二维矩阵内,找到只包含  \\\'1\\\'  的最大正方形,并返回其面积。 力扣原题链接   暴力法一般不是最优解,但是可以拿来练手 由于正方形的面积等于边长的平方,因此要找到最大正方形的面积,首先需要找到最大正方形的边长,然后计算最大边

    2024年02月13日
    浏览(49)
  • LeetCode、162. 寻找峰值【中等,最大值、二分】

    博主介绍:✌目前全网粉丝2W+,csdn博客专家、Java领域优质创作者,博客之星、阿里云平台优质作者、专注于Java后端技术领域。 涵盖技术内容:Java后端、算法、分布式微服务、中间件、前端、运维、ROS等。 博主所有博客文件目录索引:博客目录索引(持续更新) 视频平台:

    2024年01月20日
    浏览(46)
  • 【Leetcode】【每日一题】【中等】1465. 切割后面积最大的蛋糕

    力扣(LeetCode)官网 - 全球极客挚爱的技术成长平台 备战技术面试?力扣提供海量技术面试资源,帮助你高效提升编程技能,轻松拿下世界 IT 名企 Dream Offer。 https://leetcode.cn/problems/maximum-area-of-a-piece-of-cake-after-horizontal-and-vertical-cuts/description/?envType=daily-questionenvId=2023-10-27 矩形

    2024年02月07日
    浏览(35)
  • LeetCode_动态规划_中等_918.环形子数组的最大和

    给定一个长度为 n 的环形整数数组 nums ,返回 nums 的非空子数组的最大可能和。 环形数组意味着数组的末端将会与开头相连呈环状。形式上, nums[i] 的下一个元素是 nums[(i + 1) % n] , nums[i] 的前一个元素是 nums[(i - 1 + n) % n] 。 子数组最多只能包含固定缓冲区 nums 中的每个元素

    2024年02月09日
    浏览(42)
  • 2317.操作后的最大异或和

    首先num[i]^x可以知道 这里可以变成任意一个数字 又有num[i]上上面的数字 所以我们可以扣掉任意位的1把它变成0 答案让我们求异或和 所以只要这一位有1 答案的这一位就有1 我们发现这就是一个按位或运算

    2024年02月08日
    浏览(65)
  • LeetCode_动态规划_中等_1749.任意子数组和的绝对值的最大值

    给你一个整数数组 nums 。一个子数组 [nums l , nums l+1 , …, nums r-1 , nums r ] 的 和的绝对值 为 abs(nums l + nums l+1 + … + nums r-1 + nums r ) 。请你找出 nums 中和的绝对值 最大的任意子数组(可能为空),并返回该最大值。 abs(x) 定义如下: 如果 x 是负整数,那么 abs(x) = -x 。 如果 x 是非

    2024年02月13日
    浏览(35)
  • 2734. 执行子串操作后的字典序最小字符串

    给你一个仅由小写英文字母组成的字符串 s 。在一步操作中,你可以完成以下行为: 选则 s 的任一非空子字符串,可能是整个字符串,接着将字符串中的每一个字符替换为英文字母表中的前一个字符。例如,\\\'b\\\' 用 \\\'a\\\' 替换,\\\'a\\\' 用 \\\'z\\\' 替换。 返回执行上述操作 恰好一次 后可以

    2024年02月09日
    浏览(40)

觉得文章有用就打赏一下文章作者

支付宝扫一扫打赏

博客赞助

微信扫一扫打赏

请作者喝杯咖啡吧~博客赞助

支付宝扫一扫领取红包,优惠每天领

二维码1

领取红包

二维码2

领红包