当前位置: 首页 > news >正文

力扣打卡每日一题————零钱兑换

零钱兑换问题

一、问题描述

题目要求

给定不同面额的硬币coins和一个总金额amount,编写一个函数来计算可以凑成总金额所需的最少的硬币个数。如果没有任何一种硬币组合能组成总金额,返回-1

示例

  • 输入:coins = [1,2,5], amount = 11

  • 输出:3(解释:11 = 5 + 5 + 1,最少需要 3 枚硬币)

  • 输入:coins = [2], amount = 3

  • 输出:-1(解释:无法用面额 2 的硬币凑出 3)

核心难点

  1. 需找到 “最少硬币数”,而非所有组合数;
  2. 需处理 “无法凑出金额” 的边界情况;
  3. 避免数组越界、数值溢出等编码错误。

二、解题思路:动态规划(DP)

1. 状态定义

定义dp[i]表示:凑成总金额i所需的最少硬币数量

2. 初始化

  • 基准条件:dp[0] = 0,因为凑 0 元不需要任何硬币。
  • 其他状态:初始化dp[i] = amount + 1amount+1是一个 “大于最大可能值” 的数,代表 “初始不可达”。最大可能值是amount(全用 1 元硬币),因此amount+1可标记为 “未更新”。

3. 状态转移

对于每个金额i(从 1 到amount),遍历所有硬币面额coin

  • coin <= i(当前硬币面额不超过目标金额),则:dp[i] = min(dp[i], dp[i - coin] + 1)
  • 解释:dp[i - coin]是凑出i - coin元的最少硬币数,加 1 枚当前硬币即可凑出i元,取所有可能中的最小值。

4. 结果判断

  • dp[amount] > amount:说明始终未更新,无法凑出金额,返回-1
  • 否则:返回dp[amount](最少硬币数)。

三、完整代码实现

class Solution { public: int coinChange(vector<int>& coins, int amount) { vector<int> dp(amount + 1, amount + 1); dp[0] = 0; for (int i = 1; i <= amount; ++i) { for (int j = 0; j < coins.size(); ++j) { if (coins[j] <= i) { dp[i] = min(dp[i], dp[i - coins[j]] + 1); } } } return dp[amount] > amount ? -1 : dp[amount]; } };

四、复杂度分析

  • 时间复杂度O(amount * len(coins))外层循环遍历amount个金额,内层循环遍历所有硬币,总次数为两者乘积。
  • 空间复杂度O(amount)仅需维护一个大小为amount + 1的 dp 数组,属于线性空间。

五、总结

问题的核心是动态规划的状态转移思想:将 “凑金额 i” 的大问题,拆解为 “凑金额 i-coin” 的小问题

http://www.cnnetsun.cn/news/35816.html

相关文章:

  • ANTLR4 C++终极指南:深度解析语法解析实战技巧
  • Hugo Academic CV:终极指南教你打造专业学术简历网站
  • lazy.nvim中文界面配置实战:从英文到母语的无缝切换
  • Lua CJSON 极速JSON处理完全指南:从入门到精通 [特殊字符]
  • Marginotes终极指南:为网页添加智能侧边注解的简单方法
  • Stop-motion-OBJ:解锁Blender网格序列动画的终极利器
  • springboot艺术展览导览系统-计算机毕业设计源码63500
  • Harepacker-resurrected:MapleStory游戏资源编辑与WZ文件处理实战指南
  • vue基于Spring Boot的CSGO的足球赛事联赛管理系统_hld5v2z3-java毕业设计
  • vue基于Spring Boot的安康医院综合管理管理系统 功能多_mbw08261-java毕业设计
  • 精通工业自动化:IEC 61131-3 PLC编程实战指南
  • YimMenuV2:现代化C++20游戏菜单开发终极指南
  • Simditor终极指南:5分钟掌握这款轻量级富文本编辑器
  • 从卷Java到冲网安:计算机人2025自救路线图(附安全岗年薪40-150万)
  • 【MQ】Kafka与RocketMQ深度对比
  • 3步搞定离线部署:无网络环境下LSP服务器配置全攻略
  • OpenUSD与Maya USD插件动画资产导出终极指南:从零开始到专业应用
  • 3个组件+2个技巧:Vue.js让AR开发像搭积木一样简单
  • 如何快速掌握Semgrep:终极代码安全扫描完整指南
  • 被遗忘的支点:十字槽平台,工业制造的隐形基石
  • phpredis扩展的压缩技术深度解析:从性能瓶颈到优化实践
  • 10分钟搞定FossFLOW部署:Docker多架构支持与数据持久化终极指南
  • Windows PowerShell 2.0 完整安装与使用指南
  • Unity高效3D模型导入导出终极指南:glTFast全面解析
  • 5个理由让你爱上DesktopSharing:实时桌面共享的终极解决方案
  • 9、企业 Linux 系统中 X 窗口系统与打印机的配置管理
  • 13、企业级 Linux 系统安全防护全攻略
  • 17、企业 Linux 电子邮件服务配置与管理全解析
  • Fastplotlib终极指南:高性能数据可视化的完整解决方案
  • Qwen3-4B-FP8:40%硬件成本实现70%性能,轻量级大模型改写行业规则