[Leedcode][JAVA][面试题 08.11][硬币][动态规划]
【問題描述】 面試題 08.11.硬幣
硬幣。給定數量不限的硬幣,幣值為25分、10分、5分和1分,編寫代碼計算n分有幾種表示法。(結果可能會很大,你需要將結果模上1000000007)示例1:輸入: n = 5輸出:2解釋: 有兩種方式可以湊成總金額: 5=5 5=1+1+1+1+1【解答思路】
1. 動態規劃 二維數組
1.1 令 dp[i][j] 為遍歷到當下這個硬幣時,組成金額 j 的方法數目
1.2 有兩種可能性
(1)當前這個硬幣沒有取,dp[i][j]=dp[i-1][j];
(2)當前這個硬幣取了,dp[i][j]=dp[i][j-coins[i]]。最后的結果是兩者的和
1.3 將狀態轉移方程翻譯成代碼,并處理邊界條件
時間復雜度:O(NM) 空間復雜度:O(NM)
N :金額 M:硬幣類型
2. 動態規劃優化 一維數組
從上面的狀態轉移方程可以看出,dp[i][j]只與dp[i-1][j]和dp[i][j-coins[i]]有關,所以完全可以把第一個維度除掉,只用一個一維數組存儲
時間復雜度:O(MN) 空間復雜度:O(N)
N :金額 M:硬幣類型
【總結】
1. 動態規劃流程
第 1 步:設計狀態
第 2 步:狀態轉移方程
第 3 步:考慮初始化
第 4 步:考慮輸出
第 5 步:考慮是否可以狀態壓縮
2. 數組初始化
- 一維數組
1.在定義時初始化。
int[] arrays = {1, 2, 3, 4, 5}; //簡化int[] arrays = new int[]{1, 2, 3, 4, 5}; //完整格式 推薦2.先定空間,隨后賦值。
- int []age = new int[10];//動態初始化for (int i = 0; i < age.length; i++) {age[i] = i;}- 二維數組
1.在定義時初始化。
double[][] a = new double[][] {{1,2,3},{4,2,7}}; double[][] b = new double[][] {{3,3},{1,1},{2,2}};2.先定空間,隨后賦值。double [][] container = new double[3][4];
for(int i = 0; i < 3;i++) {
for(int j = 0; j < 4;j++) {
container[i][j] = 4.5;
}
}
3.DFS 全排思想(順序有關) 不可以 無序方案
- n = 6 時 ,輸出次數3(實際2)
- 1 1 1 1 1 1
- 5 1
- 1 5(重復)
參考鏈接:https://leetcode-cn.com/problems/coin-lcci/solution/dong-tai-gui-hua-jian-dan-yi-dong-by-yuanninesuns/
總結
以上是生活随笔為你收集整理的[Leedcode][JAVA][面试题 08.11][硬币][动态规划]的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 好看的php表格样式,HTML5制作表格
- 下一篇: 软件需求调研方案