Skip to content

Commit 16409ee

Browse files
committed
feat: add solutions to lc problem: No.0322.Coin Change
1 parent f1b42f0 commit 16409ee

File tree

3 files changed

+104
-3
lines changed

3 files changed

+104
-3
lines changed

solution/0300-0399/0322.Coin Change/README.md

+57-1
Original file line numberDiff line numberDiff line change
@@ -79,13 +79,69 @@ class Solution:
7979
for coin in coins:
8080
for j in range(coin, amount + 1):
8181
dp[j] = min(dp[j], dp[j - coin] + 1)
82-
return -1 if dp[amount] > amount else dp[amount]
82+
return -1 if dp[-1] > amount else dp[-1]
8383
```
8484

8585
### **Java**
8686

8787
<!-- 这里可写当前语言的特殊实现逻辑 -->
8888

89+
```java
90+
class Solution {
91+
public int coinChange(int[] coins, int amount) {
92+
int m = coins.length;
93+
int[][] dp = new int[m + 1][amount + 1];
94+
for (int i = 0; i <= m; ++i) {
95+
Arrays.fill(dp[i], amount + 1);
96+
}
97+
dp[0][0] = 0;
98+
for (int i = 1; i <= m; ++i) {
99+
int v = coins[i - 1];
100+
for (int j = 0; j <= amount; ++j) {
101+
for (int k = 0; k * v <= j; ++k) {
102+
dp[i][j] = Math.min(dp[i][j], dp[i - 1][j - k * v] + k);
103+
}
104+
}
105+
}
106+
return dp[m][amount] > amount ? - 1 : dp[m][amount];
107+
}
108+
}
109+
```
110+
111+
下面对 k 这层循环进行优化:
112+
113+
由于:
114+
115+
- `dp[i][j] = min(dp[i - 1][j], dp[i - 1][j - v] + 1, dp[i - 1][j - 2v] + 2, ... , dp[i - 1][j - kv] + k)`
116+
- `dp[i][j - v] = min( dp[i - 1][j - v], dp[i - 1][j - 2v] + 1, ... , dp[i - 1][j - kv] + k - 1)`
117+
118+
因此 `dp[i][j] = min(dp[i - 1][j], dp[i][j - v] + 1)`
119+
120+
```java
121+
class Solution {
122+
public int coinChange(int[] coins, int amount) {
123+
int m = coins.length;
124+
int[][] dp = new int[m + 1][amount + 1];
125+
for (int i = 0; i <= m; ++i) {
126+
Arrays.fill(dp[i], amount + 1);
127+
}
128+
dp[0][0] = 0;
129+
for (int i = 1; i <= m; ++i) {
130+
int v = coins[i - 1];
131+
for (int j = 0; j <= amount; ++j) {
132+
dp[i][j] = dp[i - 1][j];
133+
if (j >= v) {
134+
dp[i][j] = Math.min(dp[i][j], dp[i][j - v] + 1);
135+
}
136+
}
137+
}
138+
return dp[m][amount] > amount ? - 1 : dp[m][amount];
139+
}
140+
}
141+
```
142+
143+
空间优化:
144+
89145
```java
90146
class Solution {
91147
public int coinChange(int[] coins, int amount) {

solution/0300-0399/0322.Coin Change/README_EN.md

+46-1
Original file line numberDiff line numberDiff line change
@@ -75,11 +75,56 @@ class Solution:
7575
for coin in coins:
7676
for j in range(coin, amount + 1):
7777
dp[j] = min(dp[j], dp[j - coin] + 1)
78-
return -1 if dp[amount] > amount else dp[amount]
78+
return -1 if dp[-1] > amount else dp[-1]
7979
```
8080

8181
### **Java**
8282

83+
```java
84+
class Solution {
85+
public int coinChange(int[] coins, int amount) {
86+
int m = coins.length;
87+
int[][] dp = new int[m + 1][amount + 1];
88+
for (int i = 0; i <= m; ++i) {
89+
Arrays.fill(dp[i], amount + 1);
90+
}
91+
dp[0][0] = 0;
92+
for (int i = 1; i <= m; ++i) {
93+
int v = coins[i - 1];
94+
for (int j = 0; j <= amount; ++j) {
95+
for (int k = 0; k * v <= j; ++k) {
96+
dp[i][j] = Math.min(dp[i][j], dp[i - 1][j - k * v] + k);
97+
}
98+
}
99+
}
100+
return dp[m][amount] > amount ? - 1 : dp[m][amount];
101+
}
102+
}
103+
```
104+
105+
```java
106+
class Solution {
107+
public int coinChange(int[] coins, int amount) {
108+
int m = coins.length;
109+
int[][] dp = new int[m + 1][amount + 1];
110+
for (int i = 0; i <= m; ++i) {
111+
Arrays.fill(dp[i], amount + 1);
112+
}
113+
dp[0][0] = 0;
114+
for (int i = 1; i <= m; ++i) {
115+
int v = coins[i - 1];
116+
for (int j = 0; j <= amount; ++j) {
117+
dp[i][j] = dp[i - 1][j];
118+
if (j >= v) {
119+
dp[i][j] = Math.min(dp[i][j], dp[i][j - v] + 1);
120+
}
121+
}
122+
}
123+
return dp[m][amount] > amount ? - 1 : dp[m][amount];
124+
}
125+
}
126+
```
127+
83128
```java
84129
class Solution {
85130
public int coinChange(int[] coins, int amount) {

solution/0300-0399/0322.Coin Change/Solution.py

+1-1
Original file line numberDiff line numberDiff line change
@@ -5,4 +5,4 @@ def coinChange(self, coins: List[int], amount: int) -> int:
55
for coin in coins:
66
for j in range(coin, amount + 1):
77
dp[j] = min(dp[j], dp[j - coin] + 1)
8-
return -1 if dp[amount] > amount else dp[amount]
8+
return -1 if dp[-1] > amount else dp[-1]

0 commit comments

Comments
 (0)