DeepSeek LeetCode 518. 零钱兑换 II Java实现

发布时间:2026/11/5 7:55:07
DeepSeek    LeetCode 518. 零钱兑换 II Java实现 LeetCode 518. 零钱兑换 II — Java 实现题目思路这是典型的完全背包问题· 硬币可以无限次使用· 求组合数不关心顺序· 与 322 题零钱兑换的区别322 求的是最少硬币数本题求的是方案总数核心代码一维 DP推荐classSolution{publicintchange(intamount,int[]coins){// dp[j] 表示凑成金额 j 的组合数int[]dpnewint[amount1];dp[0]1;// 凑成金额 0 只有一种方案什么都不选// 外层遍历硬币内层遍历金额正序 组合数for(intcoin:coins){for(intjcoin;jamount;j){dp[j]dp[j-coin];}}returndp[amount];}}为什么外层必须遍历硬币这是本题最关键的要点循环顺序 含义 结果外层硬币 / 内层金额正序 每种硬币逐个加入不会重复计算顺序 ✅ 组合数外层金额 / 内层硬币 每个金额位置枚举所有硬币考虑排列 ❌ 排列数示例coins [1, 2, 5], amount 5· 正确答案组合数 4· 5· 2 2 1· 2 1 1 1· 1 1 1 1 1· 如果顺序颠倒排列数会得到 9 种把 2111 和 1112 都算作不同方案二维 DP 版本辅助理解classSolution{publicintchange(intamount,int[]coins){intncoins.length;// dp[i][j] 用前 i 种硬币凑成金额 j 的组合数int[][]dpnewint[n1][amount1];// 初始化凑成金额 0 的方案数为 1空集for(inti0;in;i)dp[i][0]1;for(inti1;in;i){for(intj1;jamount;j){// 不使用第 i 种硬币dp[i][j]dp[i-1][j];// 使用第 i 种硬币可以重复使用所以是 dp[i][j - coin] 而不是 dp[i-1][j - coin]if(jcoins[i-1]){dp[i][j]dp[i][j-coins[i-1]];}}}returndp[n][amount];}}观察dp[i][j] 只依赖于 dp[i-1][j] 和 dp[i][j-coin]同一行的左侧因此可以压缩成一维——这就是推荐写法。复杂度分析· 时间复杂度O(n × amount)其中 n coins.length· 空间复杂度O(amount)边界情况情况 结果amount 0 1空方案coins []amount 0 0amount 无法凑出 0题目保证最终结果在 int 范围内不超过 2^31 - 1无需 long。

关于本文作者

来自尧图内容编辑团队

尧图内容编辑团队 内容团队

尧图内容编辑团队

本文由尧图网络内容编辑团队执笔。团队由资深项目经理、前端工程师与设计师组成,所有内容均来自亲手交付的真实项目,先讲清问题、再给出可落地的解法。尧图深耕北京网站建设十年,服务过京华建材集团、智造科技等各行业客户,把一线经验沉淀为可复用的行业观察。

  • 十年建站经验,覆盖建材、制造、服务、文创等
  • 项目经理把关选题与事实准确性
  • 工程师与设计师联合撰写专业细节
  • 统一编辑规范,保证文风与排版一致
  • 每月复盘转化数据,迭代选题方向

延伸阅读

相关资讯与近期热门内容

深度阅读推荐

建站决策前值得细读的三篇

网站改版的5个关键决策
2024-08-12

网站改版的5个关键决策

什么时候该改版、改到什么程度、如何避免流量掉光,京华建材集团改版复盘给出答案。

获取专属建站方案

看完文章,把您的行业与预算告诉我们,免费获取一份量身定制的官网建设方案与报价。

立即免费咨询