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 * 104
  • 1 <= coins[i] <= 4 * 104

 

 给定一个长度为n的数组,数组中的第i个值为coins[i],从这个数组中选择任意个数,假设这几个数之和为x,返回连续的x的个数。

动态规划其实就是,给定一个问题,我们把它拆成一个个子问题,直到子问题可以直接解决。然后呢,把子问题答案保存起来,以减少重复计算。再根据子问题答案反推,得出原问题解的一种方法。

拆分子问题,记住过往,减少重复计算 

如果一个问题,可以把所有可能的答案穷举出来,并且穷举出来后,发现存在重叠子问题,就可以考虑使用动态规划。

  • 穷举分析
  • 确定边界
  • 找出规律,确定最优子结构
  • 写出状态转移方程

贪心算法的定义:(不知道从哪复制的)
贪心算法是指在对问题求解时,总是做出在当前看来是最好的选择。也就是说,不从整体最优上加以考虑,只做出在某种意义上的局部最优解。贪心算法不是对所有问题都能得到整体最优解,关键是贪心策略的选择,选择的贪心策略必须具备无后效性,即某个状态以前的过程不会影响以后的状态,只与当前状态有关。
解题的一般步骤是:
1.建立数学模型来描述问题;
2.把求解的问题分成若干个子问题;
3.对每一子问题求解,得到子问题的局部最优解;
4.把子问题的局部最优解合成原来问题的一个解。
贪心算法是动态规划方法的一个特例,可以证明每一个子树的根的值不取决于下面叶子的值,而只取决于当前问题的状况。换句话说,不需要知道一个节点所有子树的情况,就可以求出这个节点的值。由于贪心算法的这个特性,它对解空间树的遍历不需要自底向上,而只需要自根开始,选择最优的路,一直走到底就可以了。

子问题最优解

看着题解写题解,脑子不带转的

升序排列

 假设取前 n 个硬币能得到的以 0 为起点的连续整数范围为 [0,R[n]  子问题,从小范围到大范围

边界 :起始时,即不取任何数字时,显然只有 0 在连续整数中,此时有 R[0]=1

递推公式:取第n个硬币时,已经确定前n-1个硬币可以构成连续的整数范围为[0,R[n-1])(因为R[n-1]是取到整数的个数 ,范围从0开始,则不包含R[n-1]代表的数。),要使范围进一步扩大,取第 n 个硬币时,要使得整数 R[n−1] 能够被取得。

(1)当coins[n] > R[n−1]时,coins[n]已经不能在构成连续的整数,由于数组是升序的,即之后的数也都大于R[n−1],说明之后已不存在能扩大连续整数范围的数,有R[n′]=R[n]=R[n−1],则跳出循环返回当前最大范围。

(2)当coins[n] ≤ R[n−1]时,让[0,R[n-1])和coins[n]逐个相加,可以得范围为[0,R[n-1] + coins[n]),说明R[n] = R[n - 1] + coins[n]

得到递推公式:1798. 你能构造出连续值的最大数目_第1张图片

coding

 public int getMaximumConsecutive(int[] coins) {
        Arrays.sort(coins);  //排序数组
        int r = 1;    //定义变量计数 用0个数可以构成0 一个数
        for (int coin : coins){
            if (coin > r){
                break;
            }else{
                r += coin;
            }
        }
        return r;
    }

 

你可能感兴趣的:(leetcode,算法)