【Leetcode】1798. 你能构造出连续值的最大数目——1931

题目

1798. 你能构造出连续值的最大数目

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

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

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

  • \(conins.length==n\)
  • \(1\leq n\leq 4*10^4\)
  • \(1\leq conins[i]\leq 4*10^4\)

思路

简单分析

如果我们暴力的去存储每个数字是否能够组成,那么存在的问题是我们还需要记录这个数字用了哪些数字,而记录这个信息则需要O(n)的时间复杂度,而判断一个新的数字是否可以组成就需要遍历存储过的所有数字的信息,整体的时间复杂度就甚至超过了O(n^2)这样子的话就复杂太多了,所以这样的做法是不正确的

正确的思路

假定我们目前已经能够得到0~x,对于给定的一个新的数字v,将v与之前的0~x分别组合就得到了序列v~x+v,如果x>=v+1,此时两个新的序列就可以合并为o~v+x,此时能够连续的整数就进行了扩大。

根据上述思路,为了使得能够得到的连续整数尽可能的多,即尽可能的满足x>=v+1,此时可以优先选择较小的v,即对数组进行排序。

如此,遇到不能更新x的时候,之后当v更大的时候也会满足不能继续更新。

class Solution:
    def getMaximumConsecutive(self, coins: List[int]) -> int:
        coins.sort()
        ans = 0
        for x in coins:
            if ans + 1 < x:break
            ans += x
        return ans+1
posted @ 2024-10-23 22:15  TICSMC  阅读(20)  评论(0)    收藏  举报