# 题目描述

给你一个整数 finalSum 。请你将它拆分成若干个 互不相同 的正偶数之和,且拆分出来的正偶数数目 最多

  • 比方说,给你 finalSum = 12 ,那么这些拆分是 符合要求 的(互不相同的正偶数且和为 finalSum):(2 + 10) ,(2 + 4 + 6)(4 + 8) 。它们中,(2 + 4 + 6) 包含最多数目的整数。注意 finalSum 不能拆分成 (2 + 2 + 4 + 4) ,因为拆分出来的整数必须互不相同。

请你返回一个整数数组,表示将整数拆分成 最多 数目的正偶数数组。如果没有办法将 finalSum 进行拆分,请你返回一个 数组。你可以按 任意 顺序返回这些整数。

提示:

1 <= finalSum <= 1010

# 测试用例

用例1

  • 输入:finalSum = 12
  • 输出:[2,4,6]
  • 解释:以下是一些符合要求的拆分:(2 + 10),(2 + 4 + 6) 和 (4 + 8)(2 + 4 + 6) 为最多数目的整数,数目为 3 ,所以我们返回 [2,4,6][2,6,4] ,[6,2,4] 等等也都是可行的解

用例2

  • 输入:finalSum = 28
  • 输出:[6,8,2,12]
  • 解释:以下是一些符合要求的拆分:(2 + 26),(6 + 8 + 2 + 12)(4 + 24)(6 + 8 + 2 + 12) 有最多数目的整数,数目为 4 ,所以我们返回 [6,8,2,12][10,2,4,12] ,[6,2,4,16] 等等也都是可行的解

# 实现思路

参考代码注释

# 代码实现

/**
 * @param {number} finalSum
 * @return {number[]}
 */

var __readline = require("readline-sync");
__readline.setDefaultOptions({ prompt: "" });
var readline = __readline.prompt;

console.log("请输入finalSum: ");
const finalSum = Number(readline());

var maximumEvenSplit = function (finalSum) {
  // 贪心

  if (finalSum % 2 == 1 || finalSum < 2) {
    return [];
  }

  // 按照偶数i从小到大的顺序去遍历,每次finalSum减去i,res放入i
  // 直到i > finalSum,表示此时finalSum剩下的数字不够此时的偶数了
  // 那就把此时的finalSum加到最后放入res的偶数上,作为res的最后一个偶数元素
  // 此时的res长度即为最大

  let res = [];
  for (let i = 2; i <= finalSum; i += 2) {
    res.push(i);
    finalSum -= i;
  }
  res[res.length - 1] += finalSum;
  return res;
};

const res = maximumEvenSplit(finalSum);
console.log("结果为: ", res);

/* 
  请输入finalSum:
  12
  结果为:  [ 2, 4, 6 ]

  请输入finalSum:
  28
  结果为:  [ 2, 4, 6, 16 ]
*/

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46