zl程序教程

您现在的位置是:首页 >  其他

当前栏目

LeetCode-1798. 你能构造出连续值的最大数目【贪心,数组】

LeetCode数组 最大 连续 构造 贪心 数目
2023-09-14 09:01:27 时间

题目描述:

给你一个长度为 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

提示:

coins.length == n
1 <= n <= 4 * 10^4
1 <= coins[i] <= 4 * 10^4
https://leetcode.cn/problems/maximum-number-of-consecutive-values-you-can-make/description/

解题思路一:首先对coins排序。依次从coins里面取数c,计当前能够构造的最大的数为m(从0开始),若从coins里面取出的数c大于m+1意味着前面取出的数与后面的数无法连上,直接返回m+1。否则让m+=c。

class Solution {
public:
    int getMaximumConsecutive(vector<int>& coins) {
        int m=0;//一开始只能构造出0
        sort(coins.begin(),coins.end());//从大到小排序
        for(int c:coins){//依次从coins里面取数
            if(c>m+1) break;//无法构造出m+1,继续循环没有意义
            m+=c;//能够继续构造那么能够构造的数加c,即可以构造出区间[0,m+c]中的所有整数
        }
        return m+1;//[0,m]加上0一共有m+1个整数
    }
};

时间复杂度:O(nlogn)排序的时间。
空间复杂度:O(1)

解题思路二:0


解题思路三:0