# 题目描述
给你一个整数 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
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