博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
leetcode 322. 零钱兑换
阅读量:5794 次
发布时间:2019-06-18

本文共 1458 字,大约阅读时间需要 4 分钟。

题目:

给定不同面额的硬币 coins 和一个总金额 amount。编写一个函数来计算可以凑成总金额所需的最少的硬币个数。如果没有任何一种硬币组合能组成总金额,返回 -1。

示例 1:
输入: coins = [1, 2, 5], amount = 11
输出: 3
解释: 11 = 5 + 5 + 1
示例 2:
输入: coins = [2], amount = 3
输出: -1
说明:
你可以认为每种硬币的数量是无限的。

思路

用动态规划算法,分解问题。

求换 account金额的硬币数量 等于 account-coins 金额的硬币数量+1

  1. new一个长度为[account+1]的数组,用其下标来表示金额,用数组值来存储兑换相应金额所需的金币数
  2. 先填充上只用一个硬币可以兑换的金额,金额为下标,内容为1
  3. 从左往右遍历数组,如果当前金额能够兑换得到(即次大于0),就计算加上一个硬币所能兑换到的金额,次数为当前次数+1。

代码

class Solution {    public int coinChange(int[] coins, int amount) {        if (amount <= 0) {            return 0;        }        int[] dp = new int[amount + 1]; //记录最小兑换次数        for (int i = 0; i < coins.length; i++) {//填充1个硬币能兑换到的金额            if (coins[i] <= amount) {                dp[coins[i]] = 1;            }        }        for (int i = 0; i < dp.length; i++) {            if (dp[i] == 0) { //当前金额无法兑换到,所以不能进行下一步                continue;            }            for (int j = 0; j < coins.length; j++) {                if ((long) i + (long) coins[j] > Integer.MAX_VALUE) { //提交后发现测试用例里有个int边界值,需要排除                    continue;                }                if (i + coins[j] <= amount) { //当前金额 加上一个硬币的金额 必须小于等于 目标金额amount                    if (dp[i + coins[j]] == 0 || dp[i] + 1 < dp[i + coins[j]]) {                         dp[i + coins[j]] = dp[i] + 1;                    }                }            }        }        return dp[amount] == 0 ? -1 : dp[amount];    }}

转载于:https://www.cnblogs.com/magicya/p/10574551.html

你可能感兴趣的文章
Rainbond 5.0.4版本发布-做最好用的云应用操作系统
查看>>
多项式前k项和java_多项式朴素贝叶斯softmax改变
查看>>
XP 安装ORACLE
查看>>
八、 vSphere 6.7 U1(八):分布式交换机配置(vMotion迁移网段)
查看>>
我的友情链接
查看>>
JS中比较数字大小
查看>>
jQuery插件的开发
查看>>
基础,基础,还是基础之JAVA基础
查看>>
HTTP库Axios
查看>>
gen already exists but is not a source folder. Convert to a source folder or rename it 的解决办法...
查看>>
20个Linux服务器性能调优技巧
查看>>
填坑记:Uncaught RangeError: Maximum call stack size exceeded
查看>>
SpringCloud之消息总线(Spring Cloud Bus)(八)
查看>>
【348天】每日项目总结系列086(2018.01.19)
查看>>
【294天】我爱刷题系列053(2017.11.26)
查看>>
2016/08/25 The Secret Assumption of Agile
查看>>
(Portal 开发读书笔记)Portlet间交互-PortletSession
查看>>
JAVA中循环删除list中元素的方法总结
查看>>
Java虚拟机管理的内存运行时数据区域解释
查看>>
人人都会深度学习之Tensorflow基础快速入门
查看>>