Leetcode-2178. 拆分成最多数目的正偶数之和

  • Post author:
  • Post category:其他


链接


2178. 拆分成最多数目的正偶数之和

题目

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

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

请你返回一个整数数组,表示将整数拆分成 最多 数目的正偶数数组。如果没有办法将 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 <= finalSum <= 10e10

思路(贪心)

1. 首先题目要求对finalSum 进行拆分成尽量多的正偶数,由于任意偶数相加还是偶数,所以如果finalSum是奇数,必然无法拆分,直接返回空数组。

2. 对于finalSum是偶数的情况,我们需要尽量多的拆出更多的偶数出来,那么我们很容易想到,要让数越多,那就需要尽量贪心的让数越小,例如对于finalSum=18来说,如果拆成2和16,自然是要比4、6、8拆出来的数更少。因此,我们按照2、4、6、8、10…这样的顺序对finalSum进行拆分,直到拆分出来的所有数之和(sum)刚好≥finalSum。

3. 如果sum=finalSum,例如finalSum=12,拆分成了2、4、6,那么自然直接返回拆分结果即可。而如果sum>finalSum,也很简单,我们直接将sum-finalSum这个数删除即可,因为此前我们就是从2、4、6、8、10…这样的顺序一直往上加上来的,故sum-finalSum数必然存在于之前的序列当中,将其删除即可。

C++ Code

class Solution {
public:
    vector<long long> maximumEvenSplit(long long finalSum) {
        //奇数一定不行 偶数一定可以
        //贪心 2 4 6 8...往里面加 直到大于finalsum
        //把大于的那部分再删掉

        vector<long long> ans;
        if(finalSum%2) return ans;
        long long sum=0;
        long long N=2;
        while(sum<finalSum)
        {
            sum+=N;
            ans.push_back(N);
            N+=2;
        }
        if(sum!=finalSum) 
        {
            for (auto it = ans.begin(); it != ans.end(); )
	        {
		        if (*it==sum-finalSum) it = ans.erase(it);
		        else ++it;
	        }
        }
        return ans;
    }
};



版权声明:本文为qq_40682833原创文章,遵循 CC 4.0 BY-SA 版权协议,转载请附上原文出处链接和本声明。