LeetCode 322. 零钱兑换

题目描述

🔥 322. 零钱兑换

思路分析

完全背包最值问题

参考代码

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
func coinChange(coins []int, amount int) int {
	// 初始化 dp 数组,初始值为 amount+1
	// dp[i] 表示凑成金额 i 所需的最少硬币数量
	dp := make([]int, amount+1)
	for i := range dp {
		dp[i] = amount + 1
	}
	// 凑成金额 0 所需的硬币数量为 0
	dp[0] = 0
	// 动态规划计算硬币数量
	for i := 1; i <= amount; i++ {
		for _, coin := range coins {
			if i >= coin {
				dp[i] = min(dp[i], dp[i-coin]+1)
			}
		}
	}
	// 如果 dp[amount] 仍然是初始值,表示无解
	if dp[amount] == amount+1 {
		return -1
	}
	return dp[amount]
}

func min(a, b int) int {
	if a < b {
		return a
	}
	return b
}
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
func coinChange(coins []int, amount int) int {
	// 创建一个数组 dp,dp[i] 表示兑换金额 i 所需的最少硬币数量
	dp := make([]int, amount+1)

	// 初始化 dp 数组,将其所有值初始化为一个不可能的大数,比如 math.MaxInt32
	for i := range dp {
		dp[i] = math.MaxInt32
	}

	// 设置兑换金额为 0 需要 0 个硬币
	dp[0] = 0

	// 动态规划计算最小硬币数量
	for i := 1; i <= amount; i++ {
		for _, coin := range coins {
			if i-coin >= 0 {
				dp[i] = min(dp[i], dp[i-coin]+1)
			}
		}
	}

	// 如果 dp[amount] 仍然是 math.MaxInt32,则说明无法兑换,返回 -1,否则返回 dp[amount]
	if dp[amount] == math.MaxInt32 {
		return -1
	}
	return dp[amount]
}

func min(a, b int) int {
	if a < b {
		return a
	}
	return b
}

🍏 点击查看 Java 题解

1
2
3
4
5
6
7
8
9
10
11
12
13
class Solution {
    public int coinChange(int[] coins, int amount) {
        int[] dp = new int[amount + 1]; // dp[i] 表示凑成金额 i 所需的最少硬币数量
        Arrays.fill(dp, amount + 1);
        dp[0] = 0;
        for (int coin : coins) {
            for (int i = coin; i <= amount; i++) {
                dp[i] = Math.min(dp[i], dp[i - coin] + 1);
            }
        }
        return dp[amount] == amount + 1 ? -1 : dp[amount];
    }
}

相似题目

题目 难度 题解
最低票价 Medium  
本文作者:
本文链接: https://hgnulb.github.io/blog/89162014
版权声明: 本博客所有文章除特别声明外,均采用 CC BY-NC-SA 4.0 许可协议,转载请注明出处!