题目链接
Leetcode.2178 拆分成最多数目的正偶数之和
rating : 1538
题目描述
给你一个整数 f i n a l S u m finalSum finalSum 。请你将它拆分成若干个 互不相同 的正偶数之和,且拆分出来的正偶数数目 最多 。
- 比方说,给你 f i n a l S u m = 12 finalSum = 12 finalSum=12 ,那么这些拆分是 符合要求 的(互不相同的正偶数且和为 f i n a l S u m finalSum finalSum): ( 2 + 10 ) (2 + 10) (2+10) , ( 2 + 4 + 6 ) (2 + 4 + 6) (2+4+6) 和 ( 4 + 8 ) (4 + 8) (4+8) 。它们中, ( 2 + 4 + 6 ) (2 + 4 + 6) (2+4+6) 包含最多数目的整数。注意 f i n a l S u m finalSum finalSum 不能拆分成 ( 2 + 2 + 4 + 4 ) (2 + 2 + 4 + 4) (2+2+4+4) ,因为拆分出来的整数必须互不相同。
请你返回一个整数数组,表示将整数拆分成 最多 数目的正偶数数组。如果没有办法将 f i n a l S u m finalSum finalSum 进行拆分,请你返回一个 空 数组。你可以按 任意 顺序返回这些整数。
示例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 = 7
输出:[]
解释:没有办法将 finalSum 进行拆分。
所以返回空数组。
示例3:
输入: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] 等等也都是可行的解。
提示:
- 1 ≤ f i n a l S u m ≤ 1 0 10 1 \leq finalSum \leq 10^{10} 1≤finalSum≤1010
解法:贪心
如果 f i n a l S u m finalSum finalSum 是一个奇数,它是不可能被分割成若干个正偶数之和的,所以直接返回空列表。
如果 f i n a l S u m finalSum finalSum 是一个偶数,我们要想将其分割的数尽可能的多的话,我们应该最从小的偶数 2 2 2 开始的偶数 ( 2 , 4 , 6 , 8 , . . . ) (2,4,6,8,...) (2,4,6,8,...) 依次分割。每分割出一个偶数 x x x ,我们就将 f i n a l S u m = f i n a l S u m − x finalSum = finalSum- x finalSum=finalSum−x,直到某一刻 f i n a l S u m ≤ x finalSum \leq x finalSum≤x,说明此时不能够再分割了,所以直接把剩余部分 f i n a l S u m finalSum finalSum 加到之前分割的最后一个偶数上。
时间复杂度: O ( n ) O(n) O(n)
C++代码:
using LL = long long;
class Solution {
public:
vector<long long> maximumEvenSplit(long long sum) {
vector<LL> ans;
if(sum & 1) return ans;
for(LL i = 2;i <= sum;i += 2){
ans.emplace_back(i);
sum -= i;
}
ans.back() += sum;
return ans;
}
};