美文网首页图解LeetCode算法
图解LeetCode——1798. 你能构造出连续值的最大数目(

图解LeetCode——1798. 你能构造出连续值的最大数目(

作者: 爪哇缪斯 | 来源:发表于2023-02-03 09:25 被阅读0次

    一、题目

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

    三、解题思路

    通过题目描述,我们可以找出一下几个关键点:

    关键点1】连续整数是从0开始的,即:什么也不从coins中取。
    关键点2】可以从coins中拿出任意个硬币,但是不能重复去拿。
    关键点3】假设我们最多构造出了m个连续整数,那么其连续的整数结果集合一定是[0,1,2,3,……,m]

    了解了以上的关键点,我们就来关注一下连续集合的特殊性,即,对于区间[n, m]的连续集合,如果使得集合中每个元素都加x,那么新的集合一定也是连续的,即:[n+x, m+x]。那么根据本题要求,需要[n, m][n+x, m+x]这两个集合合并在一起(去重),也一定要具有连续性。那么我们来看下面的图例,大致分为了如下3种情况:

    【总结】在情况3种,发生了不连续,即:如果x > m + 1(即:6 > 3 + 1),那么就会产生不连续的情况。而为了方便我们计算,我们可以将题目中给出的coins数组先进行排序操作。那么如果发生了x > m + 1(其中,x就是coins(i))的情况,因为是升序排列的,所以后面的元素就不需要对比了。

    上面介绍完解题思路后,下面我们还是按照惯例,以一个输入coins[1,4,10,3,1]为例,模拟一下计算过程。(由于篇幅有限,coins[4]的图例省略没有画)

    四、代码实现

    class Solution {
        public int getMaximumConsecutive(int[] coins) {
            Arrays.sort(coins);
            int tail = 0; // 连续整数集合的最后一个元素值
            for (int coin : coins) {
                if (coin > tail + 1) return tail + 1; // 出现断层,直接返回结果
                tail += coin; // 更新区间内最大值tail
            }
            return tail + 1; // 因为从0开始,所以总数为tail加1
        }
    }
    

    今天的文章内容就这些了:

    写作不易,笔者几个小时甚至数天完成的一篇文章,只愿换来您几秒钟的 点赞 & 分享

    更多技术干货,欢迎大家关注公众号“爪哇缪斯” ~ \(o)/ ~ 「干货分享,每天更新」

    相关文章

      网友评论

        本文标题:图解LeetCode——1798. 你能构造出连续值的最大数目(

        本文链接:https://www.haomeiwen.com/subject/cltnhdtx.html