LeetCode·每日一题·2178. 拆分成最多数目的正偶数之和·贪心

作者:小迅
链接:https://leetcode.cn/problems/maximum-split-of-positive-even-integers/solutions/2332925/tan-xin-zhu-shi-chao-ji-xiang-xi-by-xun-zoioi/
来源:力扣(LeetCode)
著作权归作者所有。商业转载请联系作者获得授权,非商业转载请注明出处。

题目LeetCode·每日一题·2178. 拆分成最多数目的正偶数之和·贪心_第1张图片

 

示例LeetCode·每日一题·2178. 拆分成最多数目的正偶数之和·贪心_第2张图片

 

思路

题意 -> 给定一个整数 t,将其拆分为 n 个偶数,返回最大 n 的一个集合。

要求:

  1. n 个偶数之间不能有重复值
  2. n 个偶数之后 对于 原来的整数 t

题目要求拆分后的偶数和等于原来数 t,而偶数之后必然是偶数,因此如果 t为奇数的话,可以直接返回空。

其次,我们希望拆分成尽可能多的偶数,我们应该尽可能拆份成最小的若干个偶数。从最小的偶整数 2 开始依次尝试拆分,直到剩余的数值小于等于当前被拆分的最大偶整数为止。

此时,我们已经拆分成尽可能多的偶数,不可能拆分出更多的互不相同的偶数。

如果此时拆分后剩余的 finalSum 大于零,则将这个数值加到最大的偶整数上,从而保证所有的数互不相同而和又等于 finalsum。

代码注释超级详细

代码


/**
 * Note: The returned array must be malloced, assume caller calls free().
 */
long long* maximumEvenSplit(long long finalSum, int* returnSize){
    *returnSize = 0;
    if (finalSum & 1) return NULL;//判断奇偶
    long long *ans = (long long *)malloc(sizeof(long long) * (sqrt(finalSum) + 1));//初始化
    for (int i = 2; i <= finalSum; i += 2) {//从小枚举偶数
        ans[(*returnSize)++] = i;//记录集合
        finalSum -= i;//利用 - 代替 + 来判断结束
    }
    //将剩余不足以再开辟一个新位置的偶数和入最大值,保证唯一
    ans[(*returnSize)-1] += finalSum;
    return ans;
}   

作者:小迅
链接:https://leetcode.cn/problems/maximum-split-of-positive-even-integers/solutions/2332925/tan-xin-zhu-shi-chao-ji-xiang-xi-by-xun-zoioi/
来源:力扣(LeetCode)
著作权归作者所有。商业转载请联系作者获得授权,非商业转载请注明出处。

你可能感兴趣的:(LeetCode刷题笔记,leetcode,算法,职场和发展)