322. Coin Change

本文探讨了硬币找零问题的两种解决方案:递归方法和动态规划方法。递归方法虽然直观但效率较低,容易超时;而动态规划方法通过预计算所有金额状态实现了高效的求解。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

先贴个自己想的经过递归的方法,但依旧超时,大概能比对到30多个的时候超时
下面再贴个dp,

public class Solution {
    public int coinChange(int[] coins, int amount) {


        int[]s = coins;
        Arrays.sort(s);
        int o=coinMin(s,0,amount,0,s.length-1);
        if(o==99999999){
            return -1;
        }else{
            return o;
        }
   }
   private int coinMin(int[] coins,int number,int amount,int curMoney,int j){
       int min = 99999999;
       int cha = amount - curMoney;
       if(curMoney == amount){return number;}
       else if(curMoney > amount) return 99999999;
       else{
           for(int i=j;i>=0;i--){
               if(coins[i]>cha)continue;
               min = Math.min(coinMin(coins,number+1,amount,curMoney+coins[i],i),min);

           }
           return min;
       }


   }
}

dp解法

public int coinChange(int[] coins, int amount) {
    if(amount==0) return 0;

    int[] dp = new int [amount+1];
    dp[0]=0; // 没有硬币也是0
    for(int i=1;i<=amount; i++)
        dp[i]= Integer.MAX_VALUE;

    for(int i=0; i<=amount; i++){
        for(int coin: coins){
            if(i+coin <=amount){
                if(dp[i]==Integer.MAX_VALUE){
                    dp[i+coin] = dp[i+coin];
                }else{
                    dp[i+coin] = Math.min(dp[i+coin], dp[i]+1);
                }
            }
        }
    }

    if(dp[amount] >= Integer.MAX_VALUE)
        return -1;

    return dp[amount];
}
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值