LeetCode 322. Coin Change
2020-06-07 09:37:59
# leetcode
# core problems
Problem
1. 题目简述
给出一些面值的硬币coins,和目标金额mount,找出最少需要多少枚硬币能够组成amount,如果无法组成,则返回-1。例如:
Example 1:
Input: coins = [1, 2, 5], amount = 11
Output: 3
Explanation: 11 = 5 + 5 + 1
Example 2:
Input: coins = [2], amount = 3
Output: -1
2. 算法思路
相关问题:
经典老题目,我们需要留意的是它和combination sum的区别,combination sum是找具体的组合,而coin change只要找最小的合法组合。因此,这道题我们考虑用dp,而不是回溯法。
那么如何找到最优子问题呢?对于例子中的amount为11,它有几种组合方式:(1)10 + 1 (2)9 + 2 (3)6 + 5,找出这三者中最小的即可。其base case是当amount为0的时候,组合方式有且只有一种。递推式如下:
$$dp[i] = Math.min(dp[i - coin] + 1, dp[i]) (for coin in coins)$$
动态规划(top-down)
初始化的值没必要设置成Integer.MAX_VALUE,最大设置为amount+1即可,因为最多也就是amount个1元硬币。
1 | class Solution { |
动态规划(Bottom-up)
这里我们需要注意的只有边界case,也就是dp[0] = 0,这里要和coin change 2进行区分,那个是求方式,这个是求硬币数,不一样的!!!
1 | class Solution { |