LeetCode——1798. 你能构造出连续值的最大数目(Maximum Number of Consecutive Values You Can Make)[中等]——分析及代码(Java)

LeetCode——1798. 你能构造出连续值的最大数目[Maximum Number of Consecutive Values You Can Make][中等]——分析及代码[Java]

一、题目

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

来源:力扣(LeetCode)
链接:https://leetcode-cn.com/problems/maximum-number-of-consecutive-values-you-can-make
著作权归领扣网络所有。商业转载请联系官方授权,非商业转载请注明出处。

二、分析及代码

1. 记录边界

(1)思路

因为可构造的整数范围是连续的,在构造范围为 [0, range] 的情况下,添加值为 coins[i] 的硬币:

  • 若 coins[i] - range > 1,说明值 range + 1 无法得到,range 即为可构造的最大连续整数;
  • 否则,[0, range] 范围内的任意值 + coins[i] 此时都可以得到,其构造范围可直接更新为 [0, range + coins[i]]。

为尽量避免出现无法构造的 range + 1,可先对 coins 进行排序,从小到大使用硬币进行构造。

(2)代码

class Solution {
    
    
    public int getMaximumConsecutive(int[] coins) {
    
    
        Arrays.sort(coins);//从小到大处理硬币
        int range = 0;//当前可构造的连续整数最大值
        for (int i = 0; i < coins.length; i++) {
    
    
            if (coins[i] - range > 1)//整数range+1无法构造 
                return range + 1;//答案包括0,需+1
            else
                range += coins[i];//可构造的连续整数范围扩展
        }
        return range + 1;
    }
}

(3)结果

执行用时 :19 ms,在所有 Java 提交中击败了 98.95% 的用户;
内存消耗 :46 MB,在所有 Java 提交中击败了 36.12% 的用户。

三、其他

暂无。

猜你喜欢

转载自blog.csdn.net/zml66666/article/details/115185942
今日推荐