日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問 生活随笔!

生活随笔

當前位置: 首頁 > 编程资源 > 编程问答 >内容正文

编程问答

[Leedcode][JAVA][面试题 08.11][硬币][动态规划]

發布時間:2023/12/10 编程问答 23 豆豆
生活随笔 收集整理的這篇文章主要介紹了 [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:硬幣類型

class Solution {public int waysToChange(int n) {if (n < 5)return 1;if (n == 5)return 2;int[] coins = {1, 5, 10, 25};int[][] dp = new int[4][n + 1];// 當數量為0,1時,有1種表示法for(int i = 0; i < 4; ++i){dp[i][0] = 1;dp[i][1] = 1;} // 當只有一種硬幣時,只有1種表示法for(int i = 0; i <=n; ++i)dp[0][i] = 1;/** 狀態:dp[i][j]表示[0...i]種硬幣能組合為j的所有不同種數* 狀態轉移:取 或 不取 當前硬幣coins[i]*/for (int i = 1; i < 4; ++i) {for (int j = 2; j <= n; ++j) {if (j >= coins[i])dp[i][j] = (dp[i][j - coins[i]] + dp[i - 1][j]) % 1000000007;elsedp[i][j] = dp[i - 1][j];}}return dp[3][n];} }
2. 動態規劃優化 一維數組

從上面的狀態轉移方程可以看出,dp[i][j]只與dp[i-1][j]和dp[i][j-coins[i]]有關,所以完全可以把第一個維度除掉,只用一個一維數組存儲

時間復雜度:O(MN) 空間復雜度:O(N)
N :金額 M:硬幣類型

public int waysToChange2(int n) {int[] dp=new int[n+1];int[] coins={1,5,10,25};for(int i=0;i<=n;i++)dp[i]=1;for(int i=1;i<4;i++){for(int j=1;j<=n;j++){if(j>=coins[i])dp[j]=(dp[j]+dp[j-coins[i]])%1000000007;}}return dp[n]; }

【總結】

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(重復)
private int[] money = new int[]{1,5,10,25}; private int count = 0;public int waysToChange(int n) {if(n<5){return 1;}int i=0;conutSort(i,n);return count;}void conutSort(int i,int n){if(i>n){return ;}if(i==n){count++;count = count % 1000000007;}if(i <n){for(int j= 0 ;j<4;j++){conutSort( money[j]+i, n);}}}

參考鏈接:https://leetcode-cn.com/problems/coin-lcci/solution/dong-tai-gui-hua-jian-dan-yi-dong-by-yuanninesuns/

總結

以上是生活随笔為你收集整理的[Leedcode][JAVA][面试题 08.11][硬币][动态规划]的全部內容,希望文章能夠幫你解決所遇到的問題。

如果覺得生活随笔網站內容還不錯,歡迎將生活随笔推薦給好友。