[leetcode]Coin Change

1.只提供一种递归的思路,从上到下解决问题,没有完全优化,会超时。

public class Solution {
    public int coinChange(int[] coins, int amount) {
        Arrays.sort(coins);//jdk降序排列
        int len=coins.length;
        int total=0,pos=len-1;
        total=count(coins,pos,amount);
        return total;
    }
    
    private int count(int[] coins,int pos,int  amount){
        if( amount<0 ){
            return -1;            
        }
        if(amount %  coins[pos] == 0 ){
            return amount/coins[pos];
        }
        int tmp=-2,min=0x10000000;
        for(int i=pos;i>=0;i-- ){
            int ct=count(coins,i,amount-coins[i]);
            if(ct>=0 && ct<min){
                min=ct;
            }
        }
        if(min != 0x10000000 ){
            tmp+=min+2;
        }
        return tmp+1;
    }
}

下面是采用动态规划,从底到上的思想。

public class Solution {
    public int coinChange(int[] coins, int amount) {
        if(amount==0)
            return 0;
        int[] min=new int[amount+1];
        Arrays.sort(coins);
        int len=coins.length;
        // for(int i=0;i<len;i++){
        //     min[coins[i]]=1;
        // }
        for(int i=coins[0];i<=amount;i++ ){
            int t = 0x10000000;
            for(int j=len-1;j>=0;j--){
                if(i-coins[j] == 0){
                    min[i]=1;
                    break;
                }
                else if( i-coins[j] >0  && min[i-coins[j]]>0 &&  min[i-coins[j]] <t){
                       t=min[i-coins[j]];
                }
            }
            if(t!=0x10000000)
                min[i]=t+1;
        }
        if(min[amount] == 0)
            return -1;
        return min[amount];
    }
}



猜你喜欢

转载自blog.csdn.net/liang0000zai/article/details/51254584
今日推荐