2021-3-20LeetCode双周赛

   做了两题,这是第三题,在最开始想到的是通过深搜找到所有出现的组合情况,然后找到最大的连续段。结果题目是要求从零开始的最长的连续段。结束了看了第一大佬的答案才明白。(大佬12分钟结束战斗,我一个小时才做完两题)

题目:给你一个长度为 n 的整数数组 coins ,它代表你拥有的 n 个硬币。第 i 个硬币的值为 coins[i] 。如果你从这些硬币中选出一部分硬币,它们的和为 x ,那么称,你可以 构造 出 x 。

请返回从 0 开始(包括 0 ),你最多能 构造 出多少个连续整数。

你可能有多个相同值的硬币

 

示例 1:

输入:coins = [1,3]
输出:2
解释:你可以得到以下这些值:
- 0:什么都不取 []
- 1:取 [1]
从 0 开始,你可以构造出 2 个连续整数。

示例 2:

输入:coins = [1,1,1,4]
输出:8
解释:你可以得到以下这些值:
- 0:什么都不取 []
- 1:取 [1]
- 2:取 [1,1]
- 3:取 [1,1,1]
- 4:取 [4]
- 5:取 [4,1]
- 6:取 [4,1,1]
- 7:取 [4,1,1,1]
从 0 开始,你可以构造出 8 个连续整数。

示例 3:

输入:nums = [1,4,10,3,1]
输出:20
class Solution {
public:

int getMaximumConsecutive(vector<int>& coins) {
        sort(coins.begin(), coins.end());
        if(coins[0]!=1)return 1;// 没有1,从零以后就组成不了了
        int ans = 1;    //先取一个1,最后再考虑0的可能
        int n = coins.size();
        for(int i = 1; i < n; ++i)
        {
            if(coins[i] <= ans+1)ans = ans + coins[i];
            //小于ans+1时说明可以在ans后面连起来,因为在ans之前从零开始的都能组成,只要在前面选取的最大和的后一个,数组就能组成接下里coins[i]个情况。
            else break;//如果coins[i] > ans+1这样说明出现断层,直接结束
        }
        return ans+1;//加上和为0的情况
        
    }
};

 

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值