一:解題思路
這道題和leetcode518 比較類似。將狀態稍微修改一下,d(i,j)表示使用前i種面值的硬幣(即面值數組中0~i-1的元素),湊成數值j需要的最少硬幣數量。
Time:O(n*sum),Space;O(n*sum),其中n為面值數組的長度。
二:完整代碼示例 (C、C++、Java、Python)
方法一C++:
class Solution { public: int coinChange(vector<int>& coins, int amount) { vector<vector<int>> d(coins.size()+1,vector<int>(amount+1,0)); for (int j = 0; j <= amount; j++) d[0][j] = INT_MAX; for (int i = 1; i <= coins.size(); i++) { for (int j = 1; j <= amount; j++) { int useCurCoin = j >= coins[i - 1] ? d[i][j - coins[i - 1]] : INT_MAX; if (useCurCoin != INT_MAX) useCurCoin += 1; d[i][j] = min(d[i - 1][j], useCurCoin); } } return d[coins.size()][amount]==INT_MAX?-1:d[coins.size()][amount]; } };
方法一Java:
class Solution { public int coinChange(int[] coins, int amount) { int[][] d=new int[coins.length+1][amount+1]; for (int j=0;j<=amount;j++) d[0][j]=Integer.MAX_VALUE; for (int i=1;i<=coins.length;i++){ for (int j=1;j<=amount;j++){ int useCurCoin=j>=coins[i-1]?d[i][j-coins[i-1]]:Integer.MAX_VALUE; if (useCurCoin!=Integer.MAX_VALUE) useCurCoin+=1; d[i][j]=Math.min(d[i-1][j],useCurCoin); } } return d[coins.length][amount]==Integer.MAX_VALUE?-1:d[coins.length][amount]; } }
方法一Python: