LeetCode题【换零钱问题汇总】

简介: LeetCode题【换零钱问题汇总】

一、求换零钱的最大次数


请你计算并返回可以凑成总金额的硬币组合数。如果任何硬币组合都无法凑出总金额,返回 0 。

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

输出:4

解释:有四种方式可以凑成总金额:

5=5

5=2+2+1

5=2+1+1+1

5=1+1+1+1+1


 public static int change(int amount, int[] coins) {
        int[] dp = new int[amount+1];
        dp[0] = 1;
        for (int coin : coins) {
            for (int j = 1; j <= amount; j++) {
                if (j >= coin) {
                    dp[j] = dp[j] + dp[j - coin];
                }
            }
        }
        Arrays.sort(dp);
        return dp[dp.length-1];
    }

二、求换零钱最少的硬币个数


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

输入:coins = [1, 2, 5], amount = 11

输出:3

解释:11 = 5 + 5 + 1

输入:coins = [2], amount = 3

输出:-1

输入:coins = [1], amount = 0

输出:0

public static int coinChange(int[] coins, int amount) {
        //初始化dp表,最大值目标最大值 + 1,相当于无穷大
        int max = amount + 1;
        int[] dp = new int[amount + 1];
        //初始化dp表里面数据全部为max
        Arrays.fill(dp, max);
        //已知目标金额为0的时候,需要0个硬币
        dp[0] = 0;
        //遍历1到amount需要多少硬币
        for(int i = 1; i <= amount; i++) {
            //遍历所有硬币
            for(int coin : coins) {
                if(i - coin < 0) continue;
                //子问题dp[i-coin]加1枚硬币就是当前硬币的需要个数
                dp[i] = Math.min(dp[i], dp[i-coin] + 1);
            }
        }
        //如果目标金额的一直没有答案返回-1
        return dp[amount] == max ? -1 : dp[amount];
    }


目录
相关文章
|
6月前
|
存储
【剑指offer】-左旋转字符串-41/67
【剑指offer】-左旋转字符串-41/67
|
6月前
|
机器学习/深度学习 Java
【剑指offer】- 求1+2+3+...+n -47/67
【剑指offer】- 求1+2+3+...+n -47/67
|
5月前
leetcode题解:389.找不同
leetcode题解:389.找不同
39 0
|
6月前
剑指Offer(第二版)05
剑指Offer(第二版)05
27 0
|
6月前
剑指Offer(第二版)10-2
剑指Offer(第二版)10-2
30 0
|
6月前
剑指Offer(第二版)11
剑指Offer(第二版)11
33 0
|
6月前
|
C++
【剑指offer】-重建二叉树-04/67
【剑指offer】-重建二叉树-04/67
【剑指offer】-变态跳台阶-09/67
【剑指offer】-变态跳台阶-09/67
|
6月前
剑指Offer LeetCode 面试题58 - II. 左旋转字符串
剑指Offer LeetCode 面试题58 - II. 左旋转字符串
34 0
剑指offer-6.重建二叉树
剑指offer-6.重建二叉树
26 0