惯性聚合 高效追踪和阅读你感兴趣的博客、新闻、科技资讯
阅读原文 在惯性聚合中打开

推荐订阅源

Engineering at Meta
Engineering at Meta
G
Google Developers Blog
WordPress大学
WordPress大学
M
MIT News - Artificial intelligence
D
DataBreaches.Net
云风的 BLOG
云风的 BLOG
爱范儿
爱范儿
Microsoft Security Blog
Microsoft Security Blog
钛媒体:引领未来商业与生活新知
钛媒体:引领未来商业与生活新知
H
Hackread – Cybersecurity News, Data Breaches, AI and More
Blog — PlanetScale
Blog — PlanetScale
T
Tailwind CSS Blog
S
SegmentFault 最新的问题
阮一峰的网络日志
阮一峰的网络日志
博客园 - 三生石上(FineUI控件)
酷 壳 – CoolShell
酷 壳 – CoolShell
Recent Announcements
Recent Announcements
T
The Blog of Author Tim Ferriss
I
InfoQ
MyScale Blog
MyScale Blog
V
V2EX
B
Blog
罗磊的独立博客
freeCodeCamp Programming Tutorials: Python, JavaScript, Git & More

Lanke

Google 账号地区是日本,ChatGPT 订阅为什么还是美元? 在 Flutter 项目里折腾苹果的液态玻璃效果 从“宅斗庶女”看极端女权 一期一会 关于梦 用 Vercel AI Gateway 给博客做一个 AI 摘要服务 Claude 搜索网页报错:Unable to verify if domain is safe to fetch 的解决方法 Flutter输入面板布局优化:键盘、表情面板与@联想的丝滑切换 再谈语言和思维 还有人记得 在2026年拥有自己的博客 为 Astro 博客添加 llms.txt 使用 LLM Wiki 作为 Hermes Agent 的记忆系统 使用Obsidian 作为 Hermes Agent 的记忆数据库 流畅的下滑关闭页面 遇到的一起生产事故 好看的鼠标样式 拖了很久的更新,还是来了 Linux · 常用日志查询命令 面试 · Java面试二 面试 · Java面试一 如何实现验证码及校验 在电脑上共存MySQL 三道前端题 「随便来点」失语症 一些碰到的面试问题 关于博客主题的自问自答 重装电脑后恢复MySQL数据 如何畅玩旮旯game之软件篇--串流 欢迎来到实力至上主义教室
力扣322 零钱兑换
Lanke · 2024-11-27 · via Lanke

题目来源

322. 零钱兑换 - 力扣(LeetCode)

题目描述

给你一个整数数组 coins ,表示不同面额的硬币;以及一个整数 amount ,表示总金额。

计算并返回可以凑成总金额所需的 最少的硬币个数 。如果没有任何一种硬币组合能组成总金额,返回 -1 。

你可以认为每种硬币的数量是无限的。

示例 1: 输入:coins = [1, 2, 5], amount = 11 输出:3 解释:11 = 5 + 5 + 1

示例 2: 输入:coins = [2], amount = 3 输出:-1

示例 3: 输入:coins = [1], amount = 0 输出:0

分析

硬币不是排序好的,所以要先处理下数组。然后 amount=0,直接输出 0. 所以将 dp[0]写进 0 即可然后从小到大,找出每个金额 i 的最优解,最后就找到 amount 的最优解了。

重点理解

dp 动态规划的思想。要一步步的从小问题开始,例如本题,就是从金额 1 开始寻找最优解,直到找到 amount 的最优解

代码

java

class Solution {
    public int coinChange(int[] coins, int amount) {
         // 先排序,样例有无序的
        Arrays.sort(coins);
        // 初始化一个较大的值,表示当前还未找到可行解
        int[] dp = new int[amount + 1];
        Arrays.fill(dp, amount + 1);
        // 金额为0时,所需硬币个数为0,这是基础情况
        dp[0] = 0;

        // 从金额1块钱开始,凑i块钱需要多少个硬币
        for (int i = 1; i <= amount; i++) {
            for (int coin : coins) {
                if (coin <= i) {
                    // dp[i]存的是金额为i的时候最少的硬币数量
                    // 尝试用当前硬币去凑金额i,取较小值(当前的dp[i]和使用该硬币后的情况对比)
                    // 比如i=7,coin =5,就表示现在七块钱,用五块钱硬币凑,如果花的硬币更少
                    // 就记录此时需要的最少金币数
                    dp[i] = Math.min(dp[i], dp[i - coin] + 1);
                } else {
                    // 如果当前硬币面额大于要凑的金额,就不用继续尝试更大面额的硬币了
                    break;
                }
            }
        }

        // 如果最终结果还是初始化的较大值,说明无法凑出给定金额,返回 -1
        return dp[amount] > amount? -1 : dp[amount];
    }
}

文章标题:力扣322 零钱兑换

文章作者:Lanke

文章链接:https://blog.blueke.top/posts/li-kou-322-ling-qian-dui-huan[复制]

最后修改时间:


商业转载请联系站长获得授权,非商业转载请注明本文出处及文章链接,您可以自由地在任何媒体以任何形式复制和分发作品,也可以修改和创作,但是分发衍生作品时必须采用相同的许可协议。
本文采用CC BY-NC-SA 4.0进行许可。