2023-07-06 2178. 拆分成最多数目的正偶数之和

97 阅读1分钟

leetcode.cn/problems/ma…

可以先判断是否是奇数,奇数肯定不能拆分成偶数之和

采用贪心的想法,从最小的偶数 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;
    }
}