索引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 零钱兑换相关推荐

  1. leetcode: 322.零钱兑换

    322.零钱兑换 来源:力扣(LeetCode) 链接: https://leetcode.cn/problems/coin-change/ 给你一个整数数组 coins ,表示不同面额的硬币:以及一 ...

  2. LeetCode 322. 零钱兑换(DP)

    文章目录 1. 题目信息 2. 解题 2.1 回溯穷举 2.2 动态规划 1. 题目信息 给定不同面额的硬币 coins 和一个总金额 amount. 编写一个函数来计算可以凑成总金额所需的最少的硬币 ...

  3. golang力扣leetcode 322.零钱兑换

    322.零钱兑换 322.零钱兑换 题解 代码 322.零钱兑换 322.零钱兑换 题解 //state: dp[i]金额为i时所需最少硬币个数 //function: dp[i]=dp[i-n]+1 ...

  4. Java实现 LeetCode 322 零钱兑换

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

  5. [LeetCode] 322.零钱兑换 五种方法讲解

    322.零钱兑换 五种方法讲解 文章目录 322.零钱兑换 五种方法讲解 1 问题描述 2 问题分析 3 解决策略 3.1 递归-暴力解决 3.2 递归-加入存储 3.3 BFS 3.4 动态规划-自 ...

  6. LeetCode 322. 零钱兑换

    322. 零钱兑换 难度 中等 给你一个整数数组 coins ,表示不同面额的硬币:以及一个整数 amount ,表示总金额. 计算并返回可以凑成总金额所需的 最少的硬币个数 .如果没有任何一种硬币组 ...

  7. Leetcode 322.零钱兑换

    Time: 20190906 Type: Medium 题目描述 给定不同面额的硬币 coins 和一个总金额 amount.编写一个函数来计算可以凑成总金额所需的最少的硬币个数.如果没有任何一种硬币 ...

  8. leetcode 322. 零钱兑换 思考分析

    目录 1.题目 2.思路分析 3.参考链接 1.题目 给定不同面额的硬币 coins 和一个总金额 amount.编写一个函数来计算可以凑成总金额所需的最少的硬币个数.如果没有任何一种硬币组合能组成总 ...

  9. 99. Leetcode 322. 零钱兑换 (动态规划-完全背包)

    步骤一.确定状态: 确定dp数组及下标含义 dp数组是个amout+1的数组,dp[j]表示的是装满容量为j的背包所需要的最 少物品的个数 步骤二.推断状态方程: 对于当前物品i, 有两种选择决定了d ...

最新文章

  1. python3 _笨方法学Python_日记_DAY3
  2. AOSP 设置编译输出目录
  3. docker启动nginx代理不上_Docker nginx 反向代理设置
  4. Java黑皮书课后题第8章:*8.13(定位最大的元素)编写下面的方法,返回二维数组中最大元素的位置。返回值是包含两个元素的一维数组,这两个元素表示二维数组中最大元素的行下标和列下标
  5. java第十二章总结
  6. golang string转int8_golang 中string和int类型相互转换
  7. Cmake-cmake_minimum_required()
  8. Linux字符设备驱动
  9. CSS兼容性解决方法!important的IE7,Firefox问题
  10. 实习成长之路——设计模式实战二:如何使用面向对象的思想设计一个功能需求?接口鉴权怎么用面向对象分析实现?
  11. Snmp4j编程简介之一
  12. oracle索引实验报告,Oracle之索引(Index)实例讲解
  13. 一键保存网页为PDF
  14. (详细)华为荣耀8青春 PRA-AL00的usb调试模式在哪里开启的流程
  15. 第一个Java Web的小case
  16. 充电+拓展+投屏三合一的Type-C适配器拆解
  17. 移动端判断当前手机设备是安卓(Android)还是苹果ios
  18. 像 IDE 一样使用 vim
  19. 深圳市文化创意产业百强(2011-2012)公示
  20. uClinux移植概述

热门文章

  1. python爬取流浪地球_Scrapy爬取猫眼流浪地球影评2----- 获取数据
  2. 开源推荐! 一款开箱即用的电子签名组件
  3. 使用 docker 搭建jenkins 自动化工具
  4. Tensorflow2.0学习笔记(一)北大曹健老师教学视频1-4讲
  5. ab 是什么意思C语言中,a/b在c语言中什么意思,c语言中ab是什么意思
  6. P3594 [POI2015]WIL-Wilcze doły
  7. Jetson AGX Xavier 设置 CAN,打开pllaon时钟,jetpack5.1
  8. 编程词典 - Swift version V1.1
  9. ACM题解——动态规划专题——G天上掉馅饼
  10. Anki同步经常出错的解决办法