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

【Hot 100】322. 零钱兑换

目录

  • 引言
  • 零钱兑换
    • 我的解题
    • 代码优化
      • 优化点分析
      • 复杂度分析
      • 边界情况处理

请添加图片描述

  • 🙋‍♂️ 作者:海码007
  • 📜 专栏:算法专栏
  • 💥 标题:【Hot 100】322. 零钱兑换
  • ❣️ 寄语:书到用时方恨少,事非经过不知难!

引言

零钱兑换

  • 🎈 题目链接:
  • 🎈 做题状态:

我的解题

开始对dp数组的定义有了一点感觉。题目是求解凑齐 amount 的最小硬币数量,所以 dp 数组就是从 0 到 amount 的一个数组。依次状态转移。直到计算出 dp[amnout]。

class Solution {
public:int coinChange(vector<int>& coins, int amount) {// dp核心三部曲:定义、转移方程、初始化vector<int> dp(amount + 1, 0);for (int i = 1; i < dp.size(); ++i){// 遍历硬币类型int minCount = INT_MAX;for (int j = 0; j < coins.size(); ++j){// 判断当前索引合法,并且上一个状态能够凑齐硬币。if (i - coins[j] >= 0 && dp[i - coins[j]] != -1){minCount = min(minCount, dp[i - coins[j]]);}}// 如果当前金额数无法凑成if (minCount == INT_MAX) {dp[i] = -1;continue;}dp[i] = minCount + 1;}return dp[amount];}
};

代码优化

class Solution {
public:int coinChange(vector<int>& coins, int amount) {// 初始化dp数组:dp[i]表示凑齐金额i所需的最小硬币数vector<int> dp(amount + 1, amount + 1); // 初始化为不可能的大值dp[0] = 0;  // 金额0需要0个硬币for (int i = 1; i <= amount; ++i) {for (int coin : coins) {if (coin <= i) { // 硬币面值不超过当前金额dp[i] = min(dp[i], dp[i - coin] + 1);}}}return dp[amount] > amount ? -1 : dp[amount];}
};

优化点分析

  1. 初始化优化

    • 原代码:dp[0]=0(隐式),其他位置在循环中计算
    • 新代码:显式设置dp[0]=0,其他位置初始化为amount+1(一个不可能达到的较大值)
    • 优势:避免了对-1的特殊判断,简化状态转移逻辑
  2. 状态转移优化

    • 原代码:需要检查dp[i-coin] != -1并维护minCount
    • 新代码:直接比较dp[i]dp[i-coin]+1,无需中间变量
    • 优势:代码更简洁,减少分支判断,运行效率更高
  3. 返回条件优化

    • 原代码:依赖循环中设置的-1
    • 新代码:三元表达式直接判断dp[amount] > amount
    • 优势:逻辑更清晰,避免特殊值传递

复杂度分析

  • 时间复杂度:O(amount * n),其中n为硬币种类数
  • 空间复杂度:O(amount)
  • 优势:避免特殊值判断,减少分支预测失败,常数时间更优

边界情况处理

  1. amount=0:直接返回0(dp[0]=0
  2. 无解情况:最终返回-1dp[amount] > amount时)
  3. 大金额优化:若硬币含1元,最大硬币数=amount,故amount+1是安全阈值
http://www.xdnf.cn/news/12248.html

相关文章:

  • ABB 1MRK002247-Apr04保护继电器模块技术分析
  • 示波器电流探头校准规范指南
  • 操作系统中的设备管理,Linux下的I/O
  • mime嗅探的默认行为及Markdown文件响应格式
  • 小白升级的路-电子电路
  • Openldap 数据迁移后用户条目中 memberOf 反向属性丢失
  • 物料转运人形机器人适合应用于那些行业?解锁千行百业的智慧物流革命
  • 【Fiddler抓取手机数据包】
  • BT Panel密码修改
  • C语言| 指针引用数组元素
  • Windows上共享文件夹给Linux使用
  • 技术文档写作全攻略
  • 仿真每日一练 | Workbench手机后盖壳体类静力学分析
  • ROUGE评测指标深度解析
  • AD-线宽规则和过孔规则不生效
  • 在MATLAB中使用自定义的ROS2消息
  • MySQL中关于事务和锁的常见执行命令整理包括版本区别
  • Git Patch 使用详解:生成、应用与多提交合并导出
  • 炉石传说 第八次CCF-CSP计算机软件能力认证
  • 【大模型推理加速】MOE加速比与batchsize 关系
  • 某药监局药品详情sign值逆向
  • 第12期_网站搭建_几时网络验证1.3二改源码包2024 软件卡密系统 虚拟主机搭建笔记
  • linux下覆盖率测试总结
  • SQL Server相关的sql语句
  • React Hooks 指南:何时使用 useEffect ?
  • 鸿蒙APP测试实战:从HDC命令到专项测试
  • 【连接器专题】案例:FPC焊接金手指顶层和底层开窗/焊盘为什么要错位?
  • 《计算机是怎么跑起来的》第二章读后感
  • LeetCode 70 爬楼梯(Java)
  • 【深度学习】为什么2个3×3的卷积可以相当于一个5×5的卷积核?为什么3个3×3的卷积相当于一个7×7的卷积核,到底区别在哪里?我们该如何使用?