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

零钱兑换问题

一、问题描述

题目要求

给定不同面额的硬币 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](最少硬币数)。

三、完整代码实现

cpp 复制代码
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" 的小问题

相关推荐
CoderCodingNo5 小时前
【GESP】C++五级练习题 luogu-P1865 A % B Problem
开发语言·c++·算法
大闲在人5 小时前
7. 供应链与制造过程术语:“周期时间”
算法·供应链管理·智能制造·工业工程
小熳芋5 小时前
443. 压缩字符串-python-双指针
算法
Charlie_lll5 小时前
力扣解题-移动零
后端·算法·leetcode
chaser&upper5 小时前
矩阵革命:在 AtomGit 解码 CANN ops-nn 如何构建 AIGC 的“线性基石”
程序人生·算法
weixin_499771555 小时前
C++中的组合模式
开发语言·c++·算法
iAkuya6 小时前
(leetcode)力扣100 62N皇后问题 (普通回溯(使用set存储),位运算回溯)
算法·leetcode·职场和发展
近津薪荼6 小时前
dfs专题5——(二叉搜索树中第 K 小的元素)
c++·学习·算法·深度优先
xiaoye-duck6 小时前
吃透 C++ STL list:从基础使用到特性对比,解锁链表容器高效用法
c++·算法·stl
松☆6 小时前
CANN与大模型推理:在边缘端高效运行7B参数语言模型的实践指南
人工智能·算法·语言模型