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

简介: 图解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

三、解题思路

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

关键点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]的图例省略没有画出来)

四、代码实现

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


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

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

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

相关文章
|
6月前
【Leetcode 2645】构造有效字符串的最小插入数 —— 动态规划
状态定义:`d[i]`为将前 i 个字符拼凑成若干个 abc 所需要的最小插入数。状态转移方程: 如果` word[i]>word[i−1]`,那么`word[i]`可以和`word[i−1]`在同一组 abc 中,`d[i]=d[i−1]−1` ;否则`word[i]`单独存在于一组 abc 中,`d[i]=d[i−1]+2`
|
6月前
|
算法 测试技术 C#
区间合并|LeetCode2963:统计好分割方案的数目
区间合并|LeetCode2963:统计好分割方案的数目
|
6月前
|
算法 测试技术 C#
【贪心算法】LeetCode2071:你可以安排的最多任务数目
【贪心算法】LeetCode2071:你可以安排的最多任务数目
|
6月前
|
算法 安全 测试技术
[组合数学]LeetCode:2954:统计感冒序列的数目
[组合数学]LeetCode:2954:统计感冒序列的数目
|
1月前
【LeetCode 37】106.从中序与后序遍历构造二叉树
【LeetCode 37】106.从中序与后序遍历构造二叉树
16 0
|
3月前
|
Python
【Leetcode刷题Python】105. 从前序与中序遍历序列构造二叉树
LeetCode上105号问题"从前序与中序遍历序列构造二叉树"的Python实现,通过递归方法根据前序和中序遍历序列重建二叉树。
25 3
|
4月前
|
存储 算法
经典的滑动窗口的题目 力扣 2799. 统计完全子数组的数目(面试题)
经典的滑动窗口的题目 力扣 2799. 统计完全子数组的数目(面试题)
|
4月前
2670.找出不同元素数目差数组-力扣(LeetCode)
2670.找出不同元素数目差数组-力扣(LeetCode)
32 0
|
6月前
[leetcode~数位动态规划] 2719. 统计整数数目 hard
[leetcode~数位动态规划] 2719. 统计整数数目 hard
|
6月前
|
算法
"刷题记录:哈希表+双指针 | leetcode-2465. 不同的平均值数目 "
该文段是一篇关于编程题目的解答,主要讨论如何找到数组中所有不同平均值的个数。作者首先使用排序和哈希集来解决,将数组转为列表排序后,通过双指针计算平均值并存入哈希集以去重。然后,作者发现可以优化方案,通过双指针在排序后的数组中直接计算两数之和,用哈希集记录不重复的和,从而避免实际计算平均值,提高了算法效率。最终代码展示了这两种方法。
55 0