news 2026/4/15 13:48:31

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

作者头像

张小明

前端开发工程师

1.2k 24
文章封面图
可视化图解算法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、dp[i]的含义,根据题目的要求,确定递推公式,之后依据递推公式写出相应的代码。具体内容如下:

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

  • Python编码:https://www.bilibili.com/cheese/play/ep1375307https://www.bilibili.com/cheese/play/ep1375307

  • Java编码:https://www.bilibili.com/cheese/play/ep1368533https://www.bilibili.com/cheese/play/ep1368533

  • Golang编码:https://www.bilibili.com/cheese/play/ep1368733https://www.bilibili.com/cheese/play/ep1368733

3.编码实现

核心代码如下:

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 }

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

  • Python编码:https://www.bilibili.com/cheese/play/ep1375307https://www.bilibili.com/cheese/play/ep1375307

  • Java编码:https://www.bilibili.com/cheese/play/ep1368533

  • Golang编码:https://www.bilibili.com/cheese/play/ep1368733

4.总结

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

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

✅ 链表

✅ 二叉树

✅ 二分查找、排序

✅ 堆、栈、队列

✅ 回溯算法

✅ 哈希算法

✅ 动态规划

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

  • Python编码实现:https://www.bilibili.com/cheese/play/ss897667807https://www.bilibili.com/cheese/play/ss897667807

  • Java编码实现:https://www.bilibili.com/cheese/play/ss161443488https://www.bilibili.com/cheese/play/ss161443488

  • Golang编码实现:https://www.bilibili.com/cheese/play/ss63997https://www.bilibili.com/cheese/play/ss63997

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

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

版权声明: 本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若内容造成侵权/违法违规/事实不符,请联系邮箱:809451989@qq.com进行投诉反馈,一经查实,立即删除!
网站建设 2026/4/5 14:03:45

四川西昌电器门店:30年本地老店,5大优势让你买电器不踩坑!

【四川西昌京东家电】哪家好&#xff1a;专业深度测评开篇&#xff1a;定下基调随着西昌市民对家电品质与服务需求的提升&#xff0c;选择一家靠谱的家电门店成为关键。本次测评聚焦四川西昌家电市场&#xff0c;旨在通过客观数据与真实体验&#xff0c;为消费者提供权威选购参…

作者头像 李华
网站建设 2026/4/13 22:43:43

python 学习笔记(文件和目录操作)

创建目录 os.makedirs可以递归的创建目录结构。 import os os.makedirs(tmp/python/test,exist_okTrue) #exit_ok True指定了&#xff0c;如果某个要创建的目录已经存在&#xff0c;也不报错删除文件或目录 os.remove 可以删除一个文件 os.remove(test.py)**shutil.rmtree()**…

作者头像 李华
网站建设 2026/3/24 6:45:52

实验一 安全威胁与攻击实验

一、实验目的安全威胁与攻击实验与理论教学第一章信息安全概论相对应。本实验在学生完成MAC地址欺骗攻击与防御实验、OSPF路由项欺骗攻击和防御实验的基础上&#xff0c;使学生能够理解威胁、攻击、资产的关系&#xff0c;并理解基本安全设计原则的重要性。具体如下&#xff1a…

作者头像 李华
网站建设 2026/4/2 22:11:58

二十一、pinctrl子系统

前言 前面我们写的GPIO驱动程序都是自己在驱动里面定义好gpio引脚需要用到的寄存器&#xff0c;然后在驱动程序里面直接去配置这些寄存器。Linux是一个成熟的&#xff0c;跨平台的通用操作系统&#xff0c;对于配置引脚这样的最基本的功能&#xff0c;是已经有一套现成的框架可…

作者头像 李华
网站建设 2026/4/8 15:48:19

Java Web 社区医院信息平台系统源码-SpringBoot2+Vue3+MyBatis-Plus+MySQL8.0【含文档】

摘要 随着信息技术的快速发展&#xff0c;传统社区医院的管理模式已难以满足现代医疗服务的需求。社区医院在日常运营中涉及患者信息管理、医生排班、药品库存、预约挂号等多方面业务&#xff0c;传统的手工记录或单机系统存在效率低下、数据易丢失、信息共享困难等问题。为了提…

作者头像 李华
网站建设 2026/4/15 10:02:31

基于SpringBoot+Vue的IT交流和分享平台管理系统设计与实现【Java+MySQL+MyBatis完整源码】

摘要 随着互联网技术的快速发展&#xff0c;IT技术交流与知识分享的需求日益增长。传统的技术论坛和社交媒体平台虽然提供了基础的交流功能&#xff0c;但在专业性、系统性和用户体验方面仍有较大提升空间。尤其是在技术问答、资源共享和项目管理等方面&#xff0c;缺乏高效的整…

作者头像 李华