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

python-leetcode-零钱兑换 II

518. 零钱兑换 II - 力扣(LeetCode)

这个问题是 完全背包问题 的一个变体,可以使用 动态规划 来解决。我们定义 dp[i] 为凑成金额 i 的硬币组合数。

思路:

  1. 定义 DP 数组
    dp[i] 表示凑成金额 i 的组合数,初始化 dp[0] = 1(金额为 0 时只有一种方式,即不选取任何硬币)。

  2. 状态转移方程
    对于每个硬币 coin,遍历 dp[j](从 coinamount),更新 dp[j]

    dp[j]+=dp[j−coin]dp[j] += dp[j - coin]dp[j]+=dp[j−coin]

    这表示我们可以用 coin 这个硬币来扩展 dp[j - coin] 形成的新组合。

  3. 遍历顺序

  • 外层遍历硬币(确保组合的唯一性)
  • 内层遍历金额(从 coinamount
  • 这样保证了组合是无序的,不会重复计算顺序不同但硬币相同的组合。
class Solution:
    def change(self, amount: int, coins: List[int]) -> int:  
        dp = [0] * (amount + 1)
        dp[0] = 1  # 凑出金额 0 只有一种方式,即什么都不选
        
        for coin in coins:  # 遍历每种硬币
            for j in range(coin, amount + 1):  # 遍历金额
                dp[j] += dp[j - coin]  # 累加组合数
                
        return dp[amount]

复杂度分析

  • 时间复杂度:O(n × m),其中 namountmcoins 的数量。
  • 空间复杂度:O(n),只使用了一维 dp 数组。

总结

这个问题可以通过 动态规划 解决,核心思想是:

  • dp[j] += dp[j - coin] 这一公式表示用 coin 形成新组合。
  • 遍历硬币优先,确保组合的唯一性。
  • 空间优化:只使用一维数组 dp

http://www.kler.cn/a/573145.html

相关文章:

  • 【数据结构】什么是栈||栈的经典应用||分治递归||斐波那契问题和归并算法||递归实现||顺序栈和链栈的区分
  • MySQL零基础教程15—简单的表连接(join)
  • 外盘农产品期货数据:历史高频分钟回测的分享下载20250305
  • Linux--基本指令4(完结)和权限
  • 基于Windows11的DockerDesktop安装和布署方法简介
  • C# Unity 面向对象补全计划 之 索引器与迭代器
  • Go语言select的高级玩法
  • Vue的简单入门 三
  • OCPP扩展机制与自定义功能开发:协议灵活性设计与实践 - 慧知开源充电桩平台
  • 确定信号分析:从傅里叶级数到信号带宽的Matlab实践
  • Zookeeper 的 Node(Znode) 是什么?Zookeeper 监听机制的特点是什么?
  • Mybatis控制台打印SQL执行信息(执行方法、执行SQL、执行时间)
  • ShareExpert SparseMoE的学习
  • Sass 模块化革命:深入解析 @use 语法,打造高效 CSS 架构
  • 如何在 WebSocketHandler 中控制连接的断开
  • 016.3月夏令营:数理类
  • js 之 lodash函数库 的下载与基础使用
  • 深圳区域、人口、地铁线
  • Amorphous Data如何在DigitalOcean上构建智能、经济的AI Agent
  • Matlab实现车牌识别