news 2026/9/5 10:27:20

【LeetCode刷题】零钱兑换

作者头像

张小明

前端开发工程师

1.2k 24
文章封面图
【LeetCode刷题】零钱兑换

给你一个整数数组coins,表示不同面额的硬币;以及一个整数amount,表示总金额。

计算并返回可以凑成总金额所需的最少的硬币个数。如果没有任何一种硬币组合能组成总金额,返回-1

你可以认为每种硬币的数量是无限的。

示例 1:

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

示例 2:

输入:coins = [2], amount = 3输出:-1

示例 3:

输入:coins = [1], amount = 0输出:0

提示:

  • 1 <= coins.length <= 12
  • 1 <= coins[i] <=
  • 0 <= amount <=

解题思路(动态规划)

  1. 定义状态:设dp[i]表示 “凑成金额i所需的最少硬币数”。
  2. 初始化
    • 初始化dp数组长度为amount + 1,值为amount + 1(因为最多需要amount个 1 元硬币,用amount + 1表示 “无法凑成”);
    • dp[0] = 0(凑成金额 0 不需要硬币)。
  3. 状态转移
    • 遍历每个金额i(从 1 到amount);
    • 对每个硬币coin,若coin ≤ i,则dp[i] = min(dp[i], dp[i - coin] + 1)(选当前硬币时,硬币数 = 凑成i-coin的最少硬币数 + 1)。
  4. 结果判断:若dp[amount]仍为初始值amount + 1,说明无法凑成,返回-1;否则返回dp[amount]

Python代码:

from typing import List class Solution: def coinChange(self, coins: List[int], amount: int) -> int: """ 零钱兑换问题:计算凑成指定金额所需的最少硬币数 :param coins: 可用的硬币面额列表(非负整数,无重复) :param amount: 目标凑单金额(非负整数) :return: 最少硬币数;若无法凑成返回-1 """ # 边界条件1:目标金额为0,无需硬币 if amount == 0: return 0 # 边界条件2:硬币列表为空 或 所有硬币面额都大于目标金额,无法凑成 if not coins or min(coins) > amount: return -1 # 初始化dp数组:dp[i]表示凑成金额i所需的最少硬币数 # 初始值设为amount+1(最大可能需要amount个1元硬币,用amount+1标记"无法凑成") dp = [amount + 1] * (amount + 1) dp[0] = 0 # 基准:凑成金额0需要0个硬币 # 优化:对硬币排序,遇到大于当前金额的硬币可提前终止内层循环 coins.sort() # 遍历每个金额(从1到目标金额) for i in range(1, amount + 1): # 遍历每个硬币面额 for coin in coins: # 若当前硬币面额大于当前金额,后续硬币更大,直接break if coin > i: break # 状态转移:选当前硬币时,硬币数=凑成i-coin的最少硬币数+1 dp[i] = min(dp[i], dp[i - coin] + 1) # 最终判断:若dp[amount]仍为初始值,说明无法凑成;否则返回最少硬币数 return dp[amount] if dp[amount] != amount + 1 else -1 # ------------------- 测试用例 ------------------- if __name__ == "__main__": solution = Solution() # 测试用例1:常规可凑成(示例1) coins1 = [1, 2, 5] amount1 = 11 print(f"测试用例1:coins={coins1}, amount={amount1}") print(f"最少硬币数:{solution.coinChange(coins1, amount1)}") # 预期输出:3(5+5+1) # 测试用例2:无法凑成(示例2) coins2 = [2] amount2 = 3 print(f"\n测试用例2:coins={coins2}, amount={amount2}") print(f"最少硬币数:{solution.coinChange(coins2, amount2)}") # 预期输出:-1 # 测试用例3:金额为0(示例3) coins3 = [1] amount3 = 0 print(f"\n测试用例3:coins={coins3}, amount={amount3}") print(f"最少硬币数:{solution.coinChange(coins3, amount3)}") # 预期输出:0 # 测试用例4:硬币面额无序 + 大额金额 coins4 = [10, 5, 1, 25] amount4 = 41 print(f"\n测试用例4:coins={coins4}, amount={amount4}") print( f"最少硬币数:{solution.coinChange(coins4, amount4)}") # 预期输出:3(25+10+5+1 → 修正:25+10+5+1=41?不,25+10+5+1是4个,正确最优是25+10+5+1 或 10*4+1,实际最优是 25+10+5+1=41(4个),代码会返回4)

LeetCode提交代码:

class Solution: def coinChange(self, coins: List[int], amount: int) -> int: # 初始化dp数组,默认值为“无法凑成”的标记(amount+1) dp = [amount + 1] * (amount + 1) dp[0] = 0 # 凑成金额0需要0个硬币 # 遍历每个金额 for i in range(1, amount + 1): # 遍历每个硬币 for coin in coins: if coin <= i: # 更新最少硬币数 dp[i] = min(dp[i], dp[i - coin] + 1) # 判断结果:若dp[amount]未被更新,说明无法凑成 return dp[amount] if dp[amount] != amount + 1 else -1

程序运行结果展示

测试用例1:coins=[1, 2, 5], amount=11 最少硬币数:3 测试用例2:coins=[2], amount=3 最少硬币数:-1 测试用例3:coins=[1], amount=0 最少硬币数:0 测试用例4:coins=[10, 5, 1, 25], amount=41 最少硬币数:4

总结
本文探讨了使用动态规划解决零钱兑换问题。给定不同面额的硬币数组coins和目标金额amount,需计算凑成金额的最少硬币数,若无法凑成则返回-1。核心思路是通过动态规划数组dp记录每个金额的最小硬币数,初始化dp[0]=0,其他为amount+1(表示不可达)。遍历金额时,对每个硬币面额进行状态转移:dp[i] = min(dp[i], dp[i-coin]+1)。最终检查dp[amount]是否被更新,未更新则返回-1。Python代码实现并通过测试用例验证,如示例coins=[1,2,5]amount=11输出3(5+5+1)。算法时间复杂度为O(amount×n),其中n为硬币种类数。

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

Python适合开发的游戏

Python 凭借简洁的语法、丰富的游戏开发库 / 框架&#xff0c;以及快速迭代的优势&#xff0c;非常适合开发中小型游戏、2D 游戏、文字类游戏、游戏原型&#xff0c;但受限于性能&#xff08;GIL 限制&#xff09;&#xff0c;不适合开发大型 3A、高帧率竞技类游戏。以下是 Pyt…

作者头像 李华
网站建设 2026/9/3 7:13:56

智能家居中枢:本地化语音理解靠TensorRT实现

智能家居中枢&#xff1a;本地化语音理解靠TensorRT实现 在智能音箱刚兴起的那几年&#xff0c;用户对“唤醒慢”“断网就失灵”“总误唤醒”这些问题抱怨不断。背后的核心矛盾其实很清晰&#xff1a;把语音数据传到云端处理&#xff0c;虽然算力不成问题&#xff0c;但代价是隐…

作者头像 李华
网站建设 2026/9/3 18:58:08

ST7789V LCD驱动板引脚规划:项目应用

ST7789V驱动LCD怎么接&#xff1f;别再瞎连了&#xff01;一个引脚错&#xff0c;屏幕就花屏你有没有遇到过这种情况&#xff1a;辛辛苦苦写好UI代码&#xff0c;烧录进ESP32或STM32&#xff0c;结果屏幕要么不亮、要么花屏、偶尔白屏重启……最后发现&#xff0c;不是代码的问…

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

推理耗时下降80%:某初创公司使用TensorRT的真实反馈

推理耗时下降80%&#xff1a;某初创公司使用TensorRT的真实反馈 在一家AI视觉初创公司的开发会议室里&#xff0c;工程师们正盯着监控面板上跳动的延迟指标。他们刚上线的新一代安防分析系统&#xff0c;需要在单张T4 GPU上实时处理四路1080p视频流——而原始模型每帧耗时超过8…

作者头像 李华
网站建设 2026/9/3 7:13:56

银行智能理财顾问:低延迟对话背后的秘密武器

银行智能理财顾问&#xff1a;低延迟对话背后的秘密武器 在手机银行App中输入一句“我想买一只稳健型基金&#xff0c;年化收益5%左右”&#xff0c;不到一秒就收到专业且条理清晰的推荐方案——这背后并非简单的问答匹配&#xff0c;而是一场在毫秒之间完成的复杂AI推理。用户…

作者头像 李华
网站建设 2026/9/3 7:13:57

USB数据包传输时序分析:系统学习硬件同步机制

USB数据包传输时序深度解析&#xff1a;从硬件同步到驱动实战 你有没有遇到过这样的情况&#xff1f;USB设备在实验室测试一切正常&#xff0c;一拿到客户现场就频繁掉线、枚举失败&#xff0c;甚至音频播放断断续续像“卡碟”&#xff1f;更离谱的是&#xff0c;换根线就好了—…

作者头像 李华