作者:小迅
链接:https://leetcode.cn/problems/maximum-split-of-positive-even-integers/solutions/2332925/tan-xin-zhu-shi-chao-ji-xiang-xi-by-xun-zoioi/
来源:力扣(LeetCode)
著作权归作者所有。商业转载请联系作者获得授权,非商业转载请注明出处。
题目
示例
思路
题意 -> 给定一个整数 t,将其拆分为 n 个偶数,返回最大 n 的一个集合。
要求:
- n 个偶数之间不能有重复值
- 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)
著作权归作者所有。商业转载请联系作者获得授权,非商业转载请注明出处。