Skip to content

Commit 407fea3

Browse files
Create 322. 零钱兑换.md
1 parent 2c7fbc7 commit 407fea3

File tree

1 file changed

+70
-0
lines changed

1 file changed

+70
-0
lines changed
+70
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,70 @@
1+
#### 322. 零钱兑换
2+
3+
难度:中等
4+
5+
---
6+
7+
给你一个整数数组 `coins` ,表示不同面额的硬币;以及一个整数 `amount` ,表示总金额。
8+
9+
计算并返回可以凑成总金额所需的 **最少的硬币个数** 。如果没有任何一种硬币组合能组成总金额,返回 `-1`
10+
11+
你可以认为每种硬币的数量是无限的。
12+
13+
**示例 1:**
14+
15+
```
16+
输入:coins = [1, 2, 5], amount = 11
17+
输出:3
18+
解释:11 = 5 + 5 + 1
19+
```
20+
21+
**示例 2:**
22+
23+
```
24+
输入:coins = [2], amount = 3
25+
输出:-1
26+
```
27+
28+
**示例 3:**
29+
30+
```
31+
输入:coins = [1], amount = 0
32+
输出:0
33+
```
34+
35+
**提示:**
36+
37+
* `1 <= coins.length <= 12`
38+
* `1 <= coins[i] <= 2^31 - 1`
39+
* `0 <= amount <= 10^4`
40+
41+
---
42+
43+
动态规划:
44+
45+
`dp[i]` 指凑成总金额为 `i` 的最少硬币数量。状态转移方程为 $dp[i] = \min_{j = 0, .., n - 1}dp[i - coins[j]] + 1$。简而言之,取所有当前金额与 `coins` 数组之差最少硬币数量的最小值并加一。
46+
47+
假设 `coins = [1, 2, 5], amount = 11`,当 `i = 11` 时,取 ` coins` 数组中所有比 `11` 小的值,即 `dp[11 - 1], dp[11 - 2], dp[11 - 5]` 的最小值,最后加一即可。
48+
49+
[279. 完全平方数](https://leetcode.cn/problems/perfect-squares/) 类似,列举所有比当前值小的平方数,取其中 `dp` 数组的最小值。
50+
51+
```Java
52+
class Solution {
53+
public int coinChange(int[] coins, int amount) {
54+
int[] dp = new int[amount + 1];
55+
dp[0] = 0;
56+
for(int i = 0; i < coins.length; i++){
57+
if(coins[i] <= amount) dp[coins[i]] = 1;
58+
}
59+
for(int i = 1; i <= amount; i++){
60+
int minn = Integer.MAX_VALUE;
61+
for(int j = 0; j < coins.length; j++){
62+
if(i - coins[j] >= 0 && dp[i - coins[j]] != -1) minn = Math.min(minn, dp[i - coins[j]]);
63+
}
64+
if(minn != Integer.MAX_VALUE) dp[i] = minn + 1;
65+
else dp[i] = -1;
66+
}
67+
return dp[amount];
68+
}
69+
}
70+
```

0 commit comments

Comments
 (0)