可视化图解算法77:零钱兑换(兑换零钱)

1.题目

描述

给定数组 coinscoins中所有的值都为正整数且不重复。每个值代表一种面值的货币,每种面值的货币可以使用任意张,再给定一个amount,代表要找的钱数,求组成amount的最少货币数。

如果无解,请返回-1.

数据范围:数组大小满足 0 ≤n ≤10000 , 数组中每个数字都满足 0 <<val≤10000,0≤amount≤5000

要求:时间复杂度O*(* n*×*amount) ,空间复杂度 O(amount)。

示例 1:

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

示例 2:

复制代码
输入:coins = [2], amount = 3
输出:-1

示例 3:

复制代码
输入:coins = [1], amount = 0
输出:0

2. 题解思路

先明确变量i、dpi的含义,根据题目的要求,确定递推公式,之后依据递推公式写出相应的代码。具体内容如下:

如果文字描述的不太清楚,你可以参考视频的详细讲解。

3.编码实现

核心代码如下:

Go 复制代码
func coinChange(coins []int, amount int) int {
	//小于1的都返回0
	if amount < 1 {
		return 0
	}
	//1.定义状态. i:币值; dp[i]:币值为i的最少货币数; dp[i]表示凑齐i元最少需要多少货币数
	dp := make([]int, amount+1)
	//2.初始化边界条件:dp[0]=0 币值为0,需要最少的货币数为0; dp[i]=amount+1,设定最少的货币数不存在(无解)
	dp[0] = 0
	for i := 1; i < len(dp); i++ {
		dp[i] = amount + 1 //初始化为无解值
	}

	//3.确定递推公式:
	//3.1 遍历1-amount元
	for i := 1; i <= amount; i++ {
		//3.2 对于每一个目标值,每种面值的货币都要枚举
		for j := 0; j < len(coins); j++ { //从给定的币种遍历最合适的
			//只有面值不超过要凑的钱才能用
			if coins[j] <= i {
				//维护最小值
				cost := coins[j]
				dp[i] = min(dp[i], dp[i-cost]+1) //dp[i-cost]+1:上一次满足条件dp的基础之上加1张
			}
		}
	}
	//4.输出结果: 如果最终答案为maxInt代表无解
	if dp[amount] == amount+1 {
		return -1
	}
	return dp[amount]
}

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

具体完整代码你可以参考下面视频的详细讲解。

4.总结

对于动态规划,求解当前目标的状态dpi,则依赖于前期的状态(dpi-1或者dpi-1)。对于目标值amount,则依赖于amount之前的值,因此需要遍历遍历1 - amount元之间的所有值。

《数据结构与算法》深度精讲课程正式上线啦!7 大核心算法模块全解析:

  ✅ 链表

  ✅ 二叉树

  ✅ 二分查找、排序

  ✅ 堆、栈、队列

  ✅ 回溯算法

  ✅ 哈希算法

  ✅ 动态规划

无论你是备战笔试面试 、提升代码效率 ,还是突破技术瓶颈,这套课程都将为你构建扎实的算法思维底座。🔥立即加入学习打卡,与千名开发者共同进阶!

对于LeetCode数据结构与算法,我们总结了一套【可视化+图解】方法,依据此方法来解决相关问题,算法变得易于理解,写出来的代码可读性高也不容易出错。具体也可以参考视频详细讲解。

今日佳句:旧时王谢堂前燕,飞入寻常百姓家。

相关推荐
geovindu9 小时前
go: Enumeration Algorithm
开发语言·后端·算法·golang·枚举算法
退休倒计时9 小时前
【每日一题】LeetCode 287. 寻找重复数 TypeScript
算法·leetcode·typescript
奋发向前wcx9 小时前
y1,y2总复习笔记2 2026.7.15
java·笔记·算法
AI科技星9 小时前
《全域数学·工程应用大典》113–200讲完整总目录
数据结构·人工智能·算法·机器学习·线性回归·乖乖数学·全域数学
ttod_qzstudio9 小时前
【软考算法】软件设计师下午第四题算法总纲:从“直接放弃“到“稳稳拿分“
算法·软考
G.O.G.O.G10 小时前
《LeetCode SQL 从入门到精通(MySQL)》09
sql·mysql·leetcode
广州灵眸科技有限公司10 小时前
xfce桌面旋转说明:基于灵眸科技EASY-EAI-Nano-TB
网络·网络协议·tcp/ip·算法·php
得物技术10 小时前
从"机械应答"到"服务伙伴":得物高可控智能客服的 Agent 工程实践|AICon 演讲整理
算法·llm·agent
想要成为糕糕手10 小时前
NO.48 旋转图像 —— LeetCode 热题 100 面试导向深度解析
javascript·算法·面试
JieE21210 小时前
LeetCode 138 随机链表的复制|两种解法详解(哈希表 + 原地 O (1) 空间)
javascript·算法·面试