【每日一题Day257】LC2178拆分成最多数目的正偶数之和 | 贪心

给定一个整数finalSum,目标是将其拆分为最多数目的不同正偶数之和。算法从最小偶数2开始,尽可能选择较小的偶数,除非剩余值小于下一个偶数,否则会将剩余值直接添加,以避免重复。最终返回拆分的偶数列表。如果finalSum为奇数,则无法拆分并返回空列表。时间复杂度为O(sqrt(finalSum)),空间复杂度为O(1)。
摘要由CSDN通过智能技术生成

拆分成最多数目的正偶数之和【LC2178】

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

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

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

  • 思路

    从最小偶数开始拆分finalSum,尽可能放小偶数,使最终拆分的偶数数目最多。由于拆分出来的整数必须互不相同,那么需要判断剩余值是否小于下一个存放的偶数,如果是那么需要直接存放剩余值,不能进行拆分,否则会出现重复值

  • 实现

    class Solution {
        public List<Long> maximumEvenSplit(long finalSum) {
            // 奇数返回空,偶数从最小偶数开始进行拆分
            List<Long> res = new ArrayList<>();
            if ((finalSum & 1) == 1) return res;
            long cur = 2;
            while(finalSum > 0){
                if (cur + 2 > finalSum - cur){
                    res.add(finalSum);
                    finalSum = 0;
                }else{
                    res.add(cur);
                    finalSum -= cur;
                    cur += 2;
                }      
                
            }
            return res;
    
        }
    }
    
    • 复杂度
      • 时间复杂度: O ( f i n a l S u m ) \mathcal{O}(\sqrt {finalSum}) O(finalSum )
      • 空间复杂度: O ( 1 ) \mathcal{O}(1) O(1)
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值