LeetCodehot 力扣热题100 零钱兑换

news/2025/3/13 17:02:52/

详细运行思路

这段代码使用动态规划(Dynamic Programming, DP)解决最少硬币找零问题。

它的核心思想是:

状态转移方程

dp[i] = min(dp[i], dp[i - coins[j]] + 1)

表示兑换 i 元最少需要的硬币数,取决于使用 coins[j] 后的最优解。

代码讲解

class Solution {
public:int coinChange(vector<int>& coins, int amount) {vector<int> dp(amount + 1, amount + 1); // 初始化 dp 数组,默认值为 amount+1(相当于无穷大)dp[0] = 0; // 兑换 0 元需要 0 个硬币for (int i = 1; i <= amount; i++) {  // 遍历所有金额for (int j = 0; j < coins.size(); j++) {  // 遍历所有硬币if (i >= coins[j]) {  // 硬币 coins[j] 只能用于兑换大于等于它的金额dp[i] = min(dp[i], dp[i - coins[j]] + 1);  // 状态转移}}}return dp[amount] == (amount + 1) ? -1 : dp[amount]; // 返回结果}
};

详细运行步骤

假设 coins = [1, 2, 5],amount = 11,来看代码如何执行。

初始化

vector<int> dp(amount + 1, amount + 1); // dp[0..11] 赋值为 amount+1(12)
dp[0] = 0; // 兑换 0 元需要 0 个硬币

初始 dp 数组:

dp[0]  =  0
dp[1]  =  12
dp[2]  =  12
dp[3]  =  12
dp[4]  =  12
dp[5]  =  12
dp[6]  =  12
dp[7]  =  12
dp[8]  =  12
dp[9]  =  12
dp[10] =  12
dp[11] =  12

第一层循环:遍历金额

i = 1

遍历硬币:

• 硬币 1:可以兑换 1 元,dp[1] = min(dp[1], dp[1-1] + 1) = min(12, 0 + 1) = 1

• 硬币 2:无法兑换 1 元(跳过)

• 硬币 5:无法兑换 1 元(跳过)

更新 dp[1] = 1

dp[0]  =  0
dp[1]  =  1
dp[2]  =  12
dp[3]  =  12
dp[4]  =  12
dp[5]  =  12
dp[6]  =  12
dp[7]  =  12
dp[8]  =  12
dp[9]  =  12
dp[10] =  12
dp[11] =  12

i = 2

遍历硬币:

• 硬币 1:dp[2] = min(dp[2], dp[2-1] + 1) = min(12, 1 + 1) = 2

• 硬币 2:dp[2] = min(dp[2], dp[2-2] + 1) = min(2, 0 + 1) = 1

• 硬币 5:无法兑换 2 元(跳过)

更新 dp[2] = 1

dp[0]  =  0
dp[1]  =  1
dp[2]  =  1
dp[3]  =  12
dp[4]  =  12
dp[5]  =  12
dp[6]  =  12
dp[7]  =  12
dp[8]  =  12
dp[9]  =  12
dp[10] =  12
dp[11] =  12

i = 3

遍历硬币:

• 硬币 1:dp[3] = min(dp[3], dp[3-1] + 1) = min(12, 1 + 1) = 2

• 硬币 2:dp[3] = min(dp[3], dp[3-2] + 1) = min(2, 1 + 1) = 2

• 硬币 5:无法兑换 3 元(跳过)

更新 dp[3] = 2

dp[0]  =  0
dp[1]  =  1
dp[2]  =  1
dp[3]  =  2
dp[4]  =  12
dp[5]  =  12
dp[6]  =  12
dp[7]  =  12
dp[8]  =  12
dp[9]  =  12
dp[10] =  12
dp[11] =  12

i = 4

遍历硬币:

• 硬币 1:dp[4] = min(dp[4], dp[4-1] + 1) = min(12, 2 + 1) = 3

• 硬币 2:dp[4] = min(dp[4], dp[4-2] + 1) = min(3, 1 + 1) = 2

• 硬币 5:无法兑换 4 元(跳过)

更新 dp[4] = 2

dp[0]  =  0
dp[1]  =  1
dp[2]  =  1
dp[3]  =  2
dp[4]  =  2
dp[5]  =  12
dp[6]  =  12
dp[7]  =  12
dp[8]  =  12
dp[9]  =  12
dp[10] =  12
dp[11] =  12

继续计算 dp[5] 到 dp[11],最终得到:

dp[0]  =  0
dp[1]  =  1
dp[2]  =  1
dp[3]  =  2
dp[4]  =  2
dp[5]  =  1
dp[6]  =  2
dp[7]  =  2
dp[8]  =  3
dp[9]  =  3
dp[10] =  2
dp[11] =  3

最终结果

return dp[amount] == (amount + 1) ? -1 : dp[amount];

• dp[11] = 3

• 所以最少需要 3 枚硬币兑换 11(可能的组合:5 + 5 + 1)

总结

时间复杂度:O(n × m)(n 是 amount,m 是 coins.size())

空间复杂度:O(n)(dp 数组)


http://www.ppmy.cn/news/1578831.html

相关文章

Android app:layout_constraintHorizontal_bias=“0“属性详解

在 Android 的 ConstraintLayout 中&#xff0c;app:layout_constraintHorizontal_bias 是用于控制控件在水平方向上相对约束位置的关键属性。以下是其详细解析&#xff1a; 一、核心作用 该属性用于调整控件在两个水平约束点之间的偏移比例&#xff0c;取值范围为 0.0&#…

基于AI智能算法的无人机城市综合治理

随着人工智能技术的飞速发展&#xff0c;无人机技术与AI的结合正在成为城市治理的新趋势。无人机不仅能够提供城市上空的高清视角&#xff0c;而且通过搭载的智能算法&#xff0c;可以实现自动化的监控、分析和响应&#xff0c;极大地提升了城市管理的效率和智能化水平。 无人机…

react基础语法视图层类组件

react基础语法视图层&类组件 MVVM *区别mvc&mvvm 两者的区别&#xff1a; 数据模型去渲染视图。数据层改了&#xff0c;vue自己会监听到帮我们拿最新的数据去渲染视图&#xff1b;构建数据构建视图&#xff0c;数据驱动的思想。这一套是非常相似的。 视图中的内容改变&…

基于SpringBoot的手机销售网站设计与实现(源码+SQL脚本+LW+部署讲解等)

专注于大学生项目实战开发,讲解,毕业答疑辅导&#xff0c;欢迎高校老师/同行前辈交流合作✌。 技术范围&#xff1a;SpringBoot、Vue、SSM、HLMT、小程序、Jsp、PHP、Nodejs、Python、爬虫、数据可视化、安卓app、大数据、物联网、机器学习等设计与开发。 主要内容&#xff1a;…

K8s 1.27.1 实战系列(八)Service

一、Service介绍 1、Service 的作用与核心功能 Service 是 Kubernetes 中用于抽象一组 Pod 并提供稳定访问入口的资源。它解决了以下问题: ​Pod IP 不固定:Pod 可能因故障、扩缩容或更新导致 IP 变化,Service 通过 ClusterIP(虚拟 IP)提供固定访问地址。​负载均衡:自动…

go连接kafka基本操作

本博文源于笔者对kafka的学习&#xff0c;先遵循着对kafka的简单学习&#xff0c;然后go操作一下kafka&#xff0c;包括发送消息、消费消息、列出所有topic&#xff0c;与创建topic。内容都已经由笔者亲自测试过。 文章目录 1.kafka的学习1.1 启动kafka与zookeeper1.2 创建top…

【技术方案设计】H5埋点方案设计以及实现(入门版)

文章目录 H5事件埋点方案设计文档1. 概述2. 需求分析3. 数据结构设计4. 技术选型5. 埋点实施5.1 页面浏览事件5.2 点击事件5.3 表单提交事件5.4 数据上报函数 6. 测试与验证7. 维护与优化 H5事件埋点方案设计文档 1. 概述 本方案旨在为H5页面设计一套完整的用户行为跟踪系统&…

postman通过json获取接口返回token,设置为全局变量

1、获取登录接口返回的json的token值 在scripts的post-reponse中写入javascript脚本 var jsonData pm.response.json();//解析响应体var token jsonData.data.loginEntityAdminByEmail.token;// 假设token在响应的JSON体中的"token"字段pm.globals.set("glo…