前往小程序,Get更优阅读体验!
立即前往
首页
学习
活动
专区
工具
TVP
发布
社区首页 >专栏 >LeetCode 322. 零钱兑换

LeetCode 322. 零钱兑换

原创
作者头像
_春华秋实
发布2023-09-05 21:21:35
1230
发布2023-09-05 21:21:35
举报
文章被收录于专栏:_春华秋实_春华秋实

给你一个整数数组 coins ,表示不同面额的硬币;以及一个整数 amount ,表示总金额。计算并返回可以凑成总金额所需的 最少的硬币个数 。如果没有任何一种硬币组合能组成总金额,返回 -1 。你可以认为每种硬币的数量是无限的。

示例 1:

代码语言:javascript
复制
输入:coins = [1, 2, 5], amount = 11
输出:3 
解释:11 = 5 + 5 + 1

题目链接

贪心+回溯算法

思路:

  1. 数字大的一般用的数量少,所以逆序排序
  2. 递归遍历所有组合的情况,求道最小的数量
代码语言:javascript
复制
func coinChange(coins []int, amount int) int {
	var res = math.MaxInt32
	//首先对数据进行逆序排序,先遍历大的数据
	sort.Slice(coins, func(i, j int) bool { return coins[i] > coins[j] })
	res = coin(coins, amount, 0, 0, res)
	if res == math.MaxInt32 {
		return -1
	}
	return res
}

func coin(coins []int, amount, i, count int, ans int) int {
	if amount == 0 {
		ans = int(math.Min(float64(ans), float64(count)))
		return ans
	}
	if i == len(coins) {
		return ans
	}
	//依次遍历每个数量的 coins[i] 
	for k := amount / coins[i]; k >= 0 && k+count < ans; k-- {
		ans = coin(coins, amount-k*coins[i], i+1, count+k, ans)
	}
	return ans
}

动态规划算法

思路:coins =[1,2,5] 的情况下,dp[11] = min(dp[10],dp[9],dp[6]) + 1

代码语言:javascript
复制
func coinChange(coins []int, amount int) int {
	if amount < 1 && len(coins) < 1 {
		return -1
	}
	memo := make([]int, amount+1)
	for i := 1; i <= amount; i++ {
		memo[i] = math.MaxInt32
		for _, c := range coins {
			if i >= c && memo[i] > memo[i-c]+1 {
				memo[i] = memo[i-c] + 1
			}
		}
	}
	if memo[amount] == math.MaxInt32 {
		return -1
	}
	return memo[amount]
}

原创声明:本文系作者授权腾讯云开发者社区发表,未经许可,不得转载。

如有侵权,请联系 cloudcommunity@tencent.com 删除。

原创声明:本文系作者授权腾讯云开发者社区发表,未经许可,不得转载。

如有侵权,请联系 cloudcommunity@tencent.com 删除。

评论
登录后参与评论
0 条评论
热度
最新
推荐阅读
目录
  • 贪心+回溯算法
  • 动态规划算法
领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档