1.題目
難度:中
給定不同面額的硬幣 coins 和乙個總金額 amount。編寫乙個函式來計算可以湊成總金額所需的最少的硬幣個數。如果沒有任何一種硬幣組合能組成總金額,返回 -1。
示例 1:
輸入: coins = [1, 2, 5], amount = 11示例 2:輸出: 3
解釋: 11 = 5 + 5 + 1
輸入: coins = [2], amount = 3說明:你可以認為每種硬幣的數量是無限的。輸出: -1
2.我的解答
思路:
輸入: coins = [1, 2, 5], amount = 11湊成面值為
11
的最小硬幣數可以由以下 3 者的最小值得到:
1、湊成面值為10
的最小硬幣數 + 面值為1
的這一枚硬幣;
2、湊成面值為9
的最小硬幣數 + 面值為2
的這一枚硬幣;
3、湊成面值為6
的最小硬幣數 + 面值為5
的這一枚硬幣;
即:dp[11] = min (dp[10] + 1, dp[9] + 1, dp[6] + 1)
。
可以直接把題目的問法設計成狀態。
第 1 步:定義「狀態」
dp[i]
:湊齊總價值i
需要的最少硬幣數,狀態就是問的問題。
第 2 步:寫出「狀態轉移方程」
根據對具體例子的分析:
dp[amount] = min(1 + dp[amount - coin[i]]) for i in [0, len - 1] if coin[i] <= amount
看到**實現
//動態規劃
intcoinchange
(int
* coins,
int coinssize,
int amount)
if(number!=amount+
1) dp[i]
=number;
}return dp[amount]
;}
LeetCode刷題筆記第26題
題目 給定乙個排序陣列,你需要在原地刪除重複出現的元素,使得每個元素只出現一次,返回移除後陣列的新長度。不要使用額外的陣列空間,你必須在原地修改輸入陣列並在使用o 1 額外空間的條件下完成。題目分析 做題之前一定要將題目分析的細緻一些,因為有些條件如果一旦不注意就會造成程式結果出現偏差或者執行不通過...
LeetCode刷題筆記第35題
題目描述 給定乙個排序陣列和乙個目標值,在陣列中找到目標值,並返回其索引。如果目標值不存在於陣列中,返回它將會被按順序插入的位置。你可以假設陣列中無重複元素。解題思路 最直接的想法就是使用二分查詢,如果有序陣列中含有與target值相等的元素,直接返回對應的索引值 如果沒有則在查詢完畢之後,返回對應...
leetcode 第46題和第47題 全排列問題
leetcode 第46題和第47題 都是求乙個給定陣列中的全排列問題,不同之處在於47題中陣列的元素可以重複。這也是乙個遞迴問題。對於陣列中的每個元素,它的全排列就等於它本身加上除它以外所有的全排。所以只要這樣依次計算全排列就行。class solution private void permut...