Leetcode.322 零钱兑换
索引iii表示 amountamountamount 金额,dp[i]dp[i]dp[i] 表示最少 coinscoinscoins 个数。
递归
class Solution {int res = Integer.MAX_VALUE; // 如果作为局部变量传入的话,设为amount+1就可以表示无穷大,表示不可能public int coinChange(int[] coins, int amount) {findWay(coins,amount,0);// 如果没有任何一种硬币组合能组成总金额,返回 -1。if(res == Integer.MAX_VALUE){return -1;}return res;}public void findWay(int[] coins,int amount,int count) { // count 就是零钱数量,res也是表示零钱数量,res是count里最小的那个if(amount < 0){return;}if(amount == 0){res = Math.min(res,count);}for(int i = 0;i < coins.length;i++){findWay(coins,amount-coins[i],count+1);}}
}作者:sugar666
链接:https://leetcode-cn.com/problems/coin-change/solution/javadi-gui-ji-yi-hua-sou-suo-dong-tai-gui-hua-by-s/
来源:力扣(LeetCode)
著作权归作者所有。商业转载请联系作者获得授权,非商业转载请注明出处。
带备忘录的递归(记忆化搜索)
class Solution {int[] memo;public int coinChange(int[] coins, int amount) {memo = new int[amount+1];return findWay(coins,amount);}// memo[n] 表示钱币n可以被换取的最少的硬币数,不能换取就为-1// findWay函数的目的是为了找到 amount数量的零钱可以兑换的最少硬币数量,返回其值intpublic int findWay(int[] coins,int amount){if(amount < 0){return -1;}if(amount == 0){return 0;}// 记忆化的处理,memo[n]用赋予了值,就不用继续下面的循环// 直接的返回memo[n] 的最优值if(memo[amount] != 0){return memo[amount];}int res = Integer.MAX_VALUE;for(int i = 0;i < coins.length;i++){int count = findWay(coins,amount-coins[i]);if(count >= 0 && count < res){res = count + 1; // 加1,是为了加上得到res结果的那个步骤中,兑换的一个硬币}}memo[amount] = (res == Integer.MAX_VALUE ? -1 : res);return memo[amount];}
}作者:sugar666
链接:https://leetcode-cn.com/problems/coin-change/solution/javadi-gui-ji-yi-hua-sou-suo-dong-tai-gui-hua-by-s/
来源:力扣(LeetCode)
著作权归作者所有。商业转载请联系作者获得授权,非商业转载请注明出处。
动态规划
class Solution {public int coinChange(int[] coins, int amount) {// 自底向上的动态规划if(coins.length == 0){return -1;}// dp[n]的值: 表示的凑成总金额为n所需的最少的硬币个数int[] dp = new int[amount+1];dp[0] = 0;for(int i = 1; i <= amount;i++){int min = Integer.MAX_VALUE;for(int j = 0;j < coins.length;j++){if(i - coins[j] >= 0 && dp[i-coins[j]] < min){min = dp[i-coins[j]] + 1;}}// dp[i] = (min == Integer.MAX_VALUE ? Integer.MAX_VALUE : min);dp[i] = min;}return dp[amount] == Integer.MAX_VALUE ? -1 : dp[amount];}
}作者:sugar666
链接:https://leetcode-cn.com/problems/coin-change/solution/javadi-gui-ji-yi-hua-sou-suo-dong-tai-gui-hua-by-s/
来源:力扣(LeetCode)
著作权归作者所有。商业转载请联系作者获得授权,非商业转载请注明出处。
官方动态规划
public class Solution {public int coinChange(int[] coins, int amount) {int max = amount + 1;int[] dp = new int[amount + 1];Arrays.fill(dp, max);dp[0] = 0;for (int i = 1; i <= amount; i++) {for (int j = 0; j < coins.length; j++) {if (coins[j] <= i) {dp[i] = Math.min(dp[i], dp[i - coins[j]] + 1);}}}return dp[amount] == max ? -1 : dp[amount];}
}作者:LeetCode-Solution
链接:https://leetcode-cn.com/problems/coin-change/solution/322-ling-qian-dui-huan-by-leetcode-solution/
来源:力扣(LeetCode)
著作权归作者所有。商业转载请联系作者获得授权,非商业转载请注明出处。
Leetcode.322 零钱兑换相关推荐
- leetcode: 322.零钱兑换
322.零钱兑换 来源:力扣(LeetCode) 链接: https://leetcode.cn/problems/coin-change/ 给你一个整数数组 coins ,表示不同面额的硬币:以及一 ...
- LeetCode 322. 零钱兑换(DP)
文章目录 1. 题目信息 2. 解题 2.1 回溯穷举 2.2 动态规划 1. 题目信息 给定不同面额的硬币 coins 和一个总金额 amount. 编写一个函数来计算可以凑成总金额所需的最少的硬币 ...
- golang力扣leetcode 322.零钱兑换
322.零钱兑换 322.零钱兑换 题解 代码 322.零钱兑换 322.零钱兑换 题解 //state: dp[i]金额为i时所需最少硬币个数 //function: dp[i]=dp[i-n]+1 ...
- Java实现 LeetCode 322 零钱兑换
322. 零钱兑换 给定不同面额的硬币 coins 和一个总金额 amount.编写一个函数来计算可以凑成总金额所需的最少的硬币个数.如果没有任何一种硬币组合能组成总金额,返回 -1. 示例 1: 输 ...
- [LeetCode] 322.零钱兑换 五种方法讲解
322.零钱兑换 五种方法讲解 文章目录 322.零钱兑换 五种方法讲解 1 问题描述 2 问题分析 3 解决策略 3.1 递归-暴力解决 3.2 递归-加入存储 3.3 BFS 3.4 动态规划-自 ...
- LeetCode 322. 零钱兑换
322. 零钱兑换 难度 中等 给你一个整数数组 coins ,表示不同面额的硬币:以及一个整数 amount ,表示总金额. 计算并返回可以凑成总金额所需的 最少的硬币个数 .如果没有任何一种硬币组 ...
- Leetcode 322.零钱兑换
Time: 20190906 Type: Medium 题目描述 给定不同面额的硬币 coins 和一个总金额 amount.编写一个函数来计算可以凑成总金额所需的最少的硬币个数.如果没有任何一种硬币 ...
- leetcode 322. 零钱兑换 思考分析
目录 1.题目 2.思路分析 3.参考链接 1.题目 给定不同面额的硬币 coins 和一个总金额 amount.编写一个函数来计算可以凑成总金额所需的最少的硬币个数.如果没有任何一种硬币组合能组成总 ...
- 99. Leetcode 322. 零钱兑换 (动态规划-完全背包)
步骤一.确定状态: 确定dp数组及下标含义 dp数组是个amout+1的数组,dp[j]表示的是装满容量为j的背包所需要的最 少物品的个数 步骤二.推断状态方程: 对于当前物品i, 有两种选择决定了d ...
最新文章
- python3 _笨方法学Python_日记_DAY3
- AOSP 设置编译输出目录
- docker启动nginx代理不上_Docker nginx 反向代理设置
- Java黑皮书课后题第8章:*8.13(定位最大的元素)编写下面的方法,返回二维数组中最大元素的位置。返回值是包含两个元素的一维数组,这两个元素表示二维数组中最大元素的行下标和列下标
- java第十二章总结
- golang string转int8_golang 中string和int类型相互转换
- Cmake-cmake_minimum_required()
- Linux字符设备驱动
- CSS兼容性解决方法!important的IE7,Firefox问题
- 实习成长之路——设计模式实战二:如何使用面向对象的思想设计一个功能需求?接口鉴权怎么用面向对象分析实现?
- Snmp4j编程简介之一
- oracle索引实验报告,Oracle之索引(Index)实例讲解
- 一键保存网页为PDF
- (详细)华为荣耀8青春 PRA-AL00的usb调试模式在哪里开启的流程
- 第一个Java Web的小case
- 充电+拓展+投屏三合一的Type-C适配器拆解
- 移动端判断当前手机设备是安卓(Android)还是苹果ios
- 像 IDE 一样使用 vim
- 深圳市文化创意产业百强(2011-2012)公示
- uClinux移植概述
热门文章
- python爬取流浪地球_Scrapy爬取猫眼流浪地球影评2----- 获取数据
- 开源推荐! 一款开箱即用的电子签名组件
- 使用 docker 搭建jenkins 自动化工具
- Tensorflow2.0学习笔记(一)北大曹健老师教学视频1-4讲
- ab 是什么意思C语言中,a/b在c语言中什么意思,c语言中ab是什么意思
- P3594 [POI2015]WIL-Wilcze doły
- Jetson AGX Xavier 设置 CAN,打开pllaon时钟,jetpack5.1
- 编程词典 - Swift version V1.1
- ACM题解——动态规划专题——G天上掉馅饼
- Anki同步经常出错的解决办法