leetcode 322 零錢兌換

2022-02-08 03:08:28 字數 3382 閱讀 7003

322. 零錢兌換

給定不同面額的硬幣 coins 和乙個總金額 amount。

編寫乙個函式來計算可以湊成總金額所需的最少的硬幣個數。

如果沒有任何一種硬幣組合能組成總金額,返回 -1

。你可以認為每種硬幣的數量是無限的。

示例 1

:輸入:coins = [1, 2, 5], amount = 11

輸出:3

解釋:11 = 5 + 5 + 1

示例 2

:輸入:coins = [2], amount = 3

輸出:-1

示例 3

:輸入:coins = [1], amount = 0

輸出:0

示例 4

:輸入:coins = [1], amount = 1

輸出:1

示例 5

:輸入:coins = [1], amount = 2

輸出:2

1<= coins.length <= 12

1<= coins[i] <= 231 - 1

0<= amount <= 104

class

solution

};

class

solution }}

return dp[amount]>amount ? -1

:dp[amount];}};

請先思考如何做,再來看答案

例如:coins[1,2,5]

amount=11

dp[11]=max=amount+1

先構造乙個dp陣列,長度是amount+1,給每個元素賦值為 最大值。這裡可以設定這個最大值為 amount+1。

再賦初值,設定dp[0]=0,表示amount為0的時候,需要的硬幣個數為零。

dp陣列解釋:

這裡的dp陣列存的就是每個金額對應的最少硬幣數。存的就是最終的解。

比如dp[6]=x,表示 總金額為6的時候,需要x個硬幣。

dp陣列是不斷往後確定下去的,直到amount位置。 

看下圖,每一列的dp,當amount=x的時候,dp[x]的值就確定了下來。

比如,amount=1的時候,dp[1]就確定了,此時dp[2]、dp[3]等等還是初始的最大值,是未確定的。

amount=2的時候,dp[2]就確定了,此時dp[3]、dp[4]等等還是初始的最大值,是未確定的。

這些已經確定下來的dp值,在amount 繼續變大的時候,這些值是不會再變的。

比如amount=5, dp[1]依然是1,所以你會看到每一列的顏色不同,但是值是固定下來的。

dp[1]表示的僅僅是amount=1的時候,最小硬幣數。 

一定要動手一步一步推導一下,這樣才能加深印象。否則,今天看懂了,過了2天,又忘記怎麼寫了。

手動一步一步推導,深入到細節,理解會更深刻。

分析步驟如下:

初始值,amount = 0:

dp[0] = 0,表示 總金額為0的時候,需要0個硬幣。

牢記狀態轉移方程: dp[i] = min(dp[i], dp[i-coins[j]]+1); //核心的狀態轉移方程

我們一步一步來 推導、分析:

amount=1

dp[1] 為 max

for迴圈遍歷coins硬幣陣列

dp[1 - 1] =dp[0]=0

根據狀態轉移方程,dp[1] = 1

amount=2

dp[2]為 max 

for迴圈遍歷coins硬幣陣列

dp[2-1] = dp[1] = 1

dp[2 -2] =dp[0] =0

根據狀態轉移方程,dp[2] = 1

amount=3

dp[3]為 max 

for迴圈遍歷coins硬幣陣列

dp[3-1] = dp[2] = 1

dp[3 -2] =dp[1] =1

根據狀態轉移方程,dp[3] = 2

amount=4

dp[4]為 max 

for迴圈遍歷coins硬幣陣列

dp[4-1] = dp[3] = 3

dp[4 -2] =dp[2] =1

根據狀態轉移方程,dp[4] = 2  (很多人以為這裡會是3哦,其實是2)

amount=5

dp[5]為 max 

for迴圈遍歷coins硬幣陣列

dp[5-1] = dp[4] = 2

dp[5 -2] = dp[3] = 2

dp[5-5] = dp[0] = 0

根據狀態轉移方程,dp[5] = 1

amount=6

dp[6]為 max 

for迴圈遍歷coins硬幣陣列

dp[6-1] = dp[5] = 1

dp[6 -2] = dp[4] = 2

dp[6-5] = dp[1] = 1

根據狀態轉移方程,dp[6] = 2

amount=7

dp[7]為 max 

for迴圈遍歷coins硬幣陣列

dp[7-1] = dp[6] = 2

dp[7 -2] = dp[5] = 1

dp[7-5] = dp[2] = 1

根據狀態轉移方程,dp[7] = 2

amount=8

dp[8]為 max 

for迴圈遍歷coins硬幣陣列

dp[8-1] = dp[7] = 2

dp[8 -2] = dp[6] = 2

dp[8-5] = dp[3] = 2

根據狀態轉移方程,dp[8] = 3

amount=9

dp[9]為 max 

for迴圈遍歷coins硬幣陣列

dp[9-1] = dp[8] = 3

dp[9 -2] = dp[7] = 2

dp[9-5] = dp[4] = 2

根據狀態轉移方程,dp[9] = 3

amount=10

dp[10]為 max 

for迴圈遍歷coins硬幣陣列

dp[10-1] = dp[9] = 3

dp[10 -2] = dp[8] = 3

dp[10-5] = dp[5] = 1

根據狀態轉移方程,dp[10] = 2

amount=11

dp[11]為 max 

for迴圈遍歷coins硬幣陣列

dp[11- 1] = dp[10] = 2

dp[11 -2] = dp[9] = 3

dp[11 - 5] = dp[6] = 2

根據狀態轉移方程,dp[11] = 3

leetcode322 零錢兌換

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

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...