leetcode322 零錢兌換

2021-09-02 17:31:50 字數 1070 閱讀 7376

給定不同面額的硬幣 coins 和乙個總金額 amount。編寫乙個函式來計算可以湊成總金額所需的最少的硬幣個數。如果沒有任何一種硬幣組合能組成總金額,返回-1。

示例 1:輸入:coins =[1, 2, 5], amount =11輸出:3解釋:11 = 5 + 5 + 1

示例 2:輸入:coins =[2], amount =3輸出:-1

我們維護乙個一維動態陣列dp,其中dp[i]表示錢數為i時的最小硬幣數的找零,注意由於陣列是從0開始的,所以我們要多申請一位,陣列大小為amount+1,這樣最終結果就可以儲存在dp[amount]中了。初始化dp[0] = 0,因為目標值若為0時,就不需要硬幣了。其他值可以初始化為整型最大值,或者是amount+1,為啥呢,因為最小的硬幣是1,所以amount最多需要amount個硬幣,amount+1也就相當於整型最大值的作用了。好,接下來就是要找狀態轉移方程了,沒思路?不要緊!回歸例子1,假設我取了乙個值為5的硬幣,那麼由於目標值是11,所以是不是假如我們知道dp[6],那麼就知道了組成11的dp值了?所以我們更新dp[i]的方法就是遍歷每個硬幣,如果遍歷到的硬幣值小於i值(比如我們不能用值為5的硬幣去更新dp[3])時,我們用 dp[i - coins[j]] + 1 來更新dp[i],所以狀態轉移方程為:

dp[i] = min(dp[i], dp[i - coins[j]] + 1);

其中coins[j]為第j個硬幣,而i - coins[j]為錢數i減去其中乙個硬幣的值,剩餘的錢數在dp陣列中找到值,然後加1和當前dp陣列中的值做比較,取較小的那個更新dp陣列。

public int coinchange(int coins, int amount) }}

return (dp[amount] > amount) ? -1 : dp[amount];

}

leetcode 322 零錢兌換

給定不同面額的硬幣 coins 和乙個總金額 amount。編寫乙個函式來計算可以湊成總金額所需的最少的硬幣個數。如果沒有任何一種硬幣組合能組成總金額,返回 1。示例 1 輸入 coins 1,2,5 amount 11 輸出 3 解釋 11 5 5 1示例 2 輸入 coins 2 amount ...

LeetCode 322 零錢兌換

322 零錢兌換 題目 給定不同面額的硬幣 coins 和乙個總金額 amount。編寫乙個函式來計算可以湊成總金額所需的最少的硬幣個數。如果沒有任何一種硬幣組合能組成總金額,返回 1。示例 1 輸入 coins 1,2,5 amount 11 輸出 3 解釋 11 5 5 1 示例 2 輸入 co...

LeetCode322 零錢兌換

322.零錢兌換 給定不同面額的硬幣 coins 和乙個總金額 amount。編寫乙個函式來計算可以湊成總金額所需的最少的硬幣個數。如果沒有任何一種硬幣組合能組成總金額,返回 1。示例 1 輸入 coins 1,2,5 amount 11 輸出 3 解釋 11 5 5 1 示例 2 輸入 coins...