可以先判断是否是奇数,奇数肯定不能拆分成偶数之和
采用贪心的想法,从最小的偶数 2 开始拆分 finalSum,不断地尝试每个递增的偶数(4, 6, 8, ..., 2n)是否能成为拆分结果的一部分。拆分过程可能会碰到如下情况:
- 剩余待拆分的数字小于当前用来尝试拆分的偶数
- 剩余待拆分的数字是奇数
这三种情况都说明,我们前一次拆分是不正确的,会导致后续无法再进行拆分了。因此,我们需要回溯,也即是把上一轮拆分的偶数加回待拆分的数字中去,使用下一个偶数进行拆分。
时间复杂度 O(sqrt(n))
空间复杂度 O(1)
class Solution {
public List<Long> maximumEvenSplit(long finalSum) {
if (finalSum % 2 == 1) {
return Collections.emptyList();
}
List<Long> ans = new ArrayList<>();
long nextNum = 2;
while (finalSum != 0) {
if (finalSum % 2 == 1 || finalSum < nextNum) {
long top = ans.remove(ans.size() - 1);
finalSum += top;
nextNum = top + 2;
}
ans.add(nextNum);
finalSum -= nextNum;
nextNum += 2;
}
return ans;
}
}