Leetcode 322. 零钱兑换

秒速五厘米 2022-09-11 15:18 295阅读 0赞

题目重述

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

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

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

示例 1:

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

示例 2:

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

示例 3:

  1. 输入:coins = [1], amount = 0
  2. 输出:0

示例 4:

  1. 输入:coins = [1], amount = 1
  2. 输出:1

示例 5:

输入:coins = [1], amount = 2
输出:2

提示:

1 <= coins.length <= 12
1 <= coins[i] <= 231 - 1
0 <= amount <= 104

来源:力扣(LeetCode)
链接:https://leetcode-cn.com/problems/coin-change
著作权归领扣网络所有。商业转载请联系官方授权,非商业转载请注明出处。

思路

这道题第一想法是暴力递归,也可以看成是暴力搜索,但这样会超时,那么我们可以采用记忆化搜素的方法,设置int数组count ,下标代表某个金币数额 需要的最小硬币。

如果之前搜索过,那就可以不再搜索,直接返回。

Java实现

  1. class Solution {
  2. private int minNum = -1;
  3. public int coinChange(int[] coins, int amount) {
  4. if (amount == 0) {
  5. return 0;
  6. }
  7. // 当前总金额
  8. long currentSum = 0;
  9. // 当前的硬币个数
  10. int currentNum = 0;
  11. dfs(coins,currentSum,currentNum,amount);
  12. return minNum;
  13. }
  14. void dfs(int[] coins,long currentSum,int currentNum,int amount){
  15. // 必凑不成,返回
  16. if(currentSum>amount){
  17. return;
  18. }
  19. // 凑成
  20. if(currentSum == amount){
  21. if(minNum==-1){
  22. minNum = currentNum;
  23. }else{
  24. minNum = Math.min(minNum,currentNum);
  25. }
  26. return;
  27. }
  28. for (int j = 0; j < coins.length; j++) {
  29. dfs(coins,currentSum+coins[j],currentNum+1,amount);
  30. }
  31. }
  32. }

发表评论

表情:
评论列表 (有 0 条评论,295人围观)

还没有评论,来说两句吧...

相关阅读

    相关 leetcode 322 零钱兑换

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

    相关 leetcode322 零钱兑换

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

    相关 322. 零钱兑换

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

    相关 Leetcode 322. 零钱兑换

    题目重述 给你一个整数数组 coins ,表示不同面额的硬币;以及一个整数 amount ,表示总金额。 计算并返回可以凑成总金额所需的 最少的硬币个数 。如果没有任何

    相关 LeetCode-322. 零钱兑换

    [322. 零钱兑换][322.] 给定不同面额的硬币 coins 和一个总金额 amount。编写一个函数来计算可以凑成总金额所需的最少的硬币个数。如果没有任何一种硬币