LeetCode-1798. 你能构造出连续值的最大数目【贪心,数组】
2023-09-14 09:01:27 时间
LeetCode-1798. 你能构造出连续值的最大数目【贪心,数组】
题目描述:
给你一个长度为 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
相关文章
- Java实现 LeetCode 421 数组中两个数的最大异或值
- Java实现 LeetCode 330 按要求补齐数组
- Java实现 LeetCode 208 实现 Trie (前缀树)
- Java实现 LeetCode 136 只出现一次的数字
- Java实现 LeetCode 108 将有序数组转换为二叉搜索树
- LeetCode:152_Maximum Product Subarray | 最大乘积连续子数组 | Medium
- leetcode - 子数组最大平均值
- [LeetCode] Reverse Linked List II
- LeetCode(93): 复原IP地址
- LeetCode-2373. 矩阵中的局部最大值【矩阵,数组】
- LeetCode-1662. 检查两个字符串数组是否相等【数组,双指针,字符串】
- LeetCode-53. 最大子数组和
- 462. 最小操作次数使数组元素相等 II——【Leetcode每日一题】
- 【LeetCode 4】寻找两个有序数组的中位数
- LeetCode - 53 最大子数组和
- 【LeetCode Python实现】33. 搜索旋转排序数组(中等)
- 【LeetCode 简单 数组 python3】485.最大连续1的个数
- 【LeetCode 简单 排序 python3】349. 两个数组的交集
- Leetcode 643. 子数组最大平均数 I(网友思路)
- Leetcode 1464. 数组中两元素的最大乘积
- Leetcode 1296. 划分数组为连续数字的集合(提供一种思路)
- 【Leetcode刷题Python】33. 搜索旋转排序数组
- 【Leetcode刷题Python】剑指 Offer 21. 调整数组顺序使奇数位于偶数前面
- 【LeetCode】53.最大子数组和