要求我们把数字拆分成若干个正偶数,且拆分出的数目最多,我们可以从2,4,6开始拆,沿正偶数递增拆,可以保证拆得数目最多,在每拆出一个偶数时,将总数减去它,直到当前数字小于当前所剩最小偶数+当前最小偶数加2就拆不出来了。
因为我们从小到大拆的偶数,题目要求是互不相同,记当前所剩最小偶数为i,当前所剩数字为x。如果不能拆相同的数字,就要保证当前数字能拆成i和i+2,所以只要满足x=i+i+2,就可以继续拆。
另外如果当前数字是奇数,必不可能全拆成偶数,直接返回即可,否则必能全部拆成偶数相加。
class Solution {
public:
vector<long long> maximumEvenSplit(long long finalSum) {
vector<long long> ans;
if(finalSum%2==1) return ans; //奇数情况
for(long long i=2;i+(i+2)<=finalSum;i+=2) //从小到大枚举偶数,如果i+i+2<当前数则拆不了
{
ans.push_back(i); //记录答案
finalSum-=i; //更新当前数字
}
ans.push_back(finalSum); //将最后剩下的无法再拆的数字加上
return ans;
}
};