你能构造出连续值的最大数目
难度:中等
给你一个长度为 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
贪心算法
思路:
首先,对数组 c o i n s coins coins 进行从小到大的排序。设利用数组 c o i n s coins coins 中的前iii个元素可以构造出 [ 0 , x ] [0,x] [0,x] 中的任何一个值,对于第 i + 1 i+1 i+1 个元素 v v v,有以下两种情况:
- 如果 v < = x + 1 v<=x+1 v<=x+1,就一定可以构造出 [ 0 , x + v ] [0,x+v] [0,x+v] 中的任何一个数值,继续遍历数组 c o i n s coins coins 中下一个元素。
- 如果 v > x + 1 v>x+1 v>x+1,数值 x + 1 x+1 x+1 无法由数组 c o i n s coins coins 中的元素构造出来,算法结束。
复杂度分析:
- 时间复杂度: O ( n log ( n ) ) O(n\text{log}(n)) O(nlog(n)), 设 c o i n s coins coins 数组的长度为 n n n,排序需要 O ( n log ( n ) ) O(n\text{log}(n)) O(nlog(n)) 的时间,迭代最多只需要遍历一次 c o i n s coins coins,所以总的计算复杂度为 O ( n log ( n ) ) O(n\text{log}(n)) O(nlog(n))。
- 空间复杂度: O ( log ( n ) ) O(\text{log}(n)) O(log(n)), 排序需要 O ( log ( n ) ) O(\text{log}(n)) O(log(n)) 的额外空间,迭代中只需要常数项的额外空间,所以总的空间复杂度为 O ( log ( n ) ) O(\text{log}(n)) O(log(n))。
class Solution:
def getMaximumConsecutive(self, coins: List[int]) -> int:
coins.sort()
cur = 0
for i in coins:
if i > cur + 1:
break
cur += i
return cur + 1
来源:力扣(LeetCode)
链接:https://leetcode.cn/problems/maximum-number-of-consecutive-values-you-can-make