代码随想录算法训练营 day 45: ● 70. 爬楼梯 (进阶) ● 322. 零钱兑换 ● 279.完全平方数

21 阅读1分钟

322. Coin Change

递推公式 dp[j] = min(dp[j-coins[i]], dp[j]) 但有条件,就是dp[j-coins[i]]要有解。因为是取最小值,所以要把dp初始化为MAX INT 另外, dp[0]应初始化为0.

class Solution {
    public int coinChange(int[] coins, int amount) {
        int[] dp = new int[amount + 1];


        for(int i=0; i<dp.length; i++) {
            dp[i] = Integer.MAX_VALUE;
        }
        dp[0] = 0;

        for(int i=0; i<coins.length; i++) {
            for(int j=coins[i]; j<=amount; j++) {
                if(dp[j-coins[i]] == Integer.MAX_VALUE) {
                    continue;
                }
                dp[j] = Math.min(dp[j-coins[i]] + 1, dp[j]);
            }
        }

        if(dp[amount] == Integer.MAX_VALUE) {
            return -1;
        }
        else {
            return dp[amount];
        }
        
    }
}

279. Perfect Squares 跟前一题差不多。处理好完全平方数的循环终止条件即可。我是放了一个if,在平方数大于n的时候终止循环。

class Solution {
    public int numSquares(int n) {
        int[] dp = new int[n+1];

        for(int i=0; i<dp.length; i++) {
            dp[i] = Integer.MAX_VALUE;
        }

        dp[0] = 0;

        for(int i=0; i<=n; i++) {
            if(i*i > n) {
                break;
            }
            int ps = i*i;
            for(int j=ps; j<=n; j++) {
                if(dp[j-ps] == Integer.MAX_VALUE) {
                    continue;
                }

                dp[j] = Math.min(dp[j-ps] + 1, dp[j]);
            }
        }

        return dp[n];
    }
}