代码随想录训练营第45天| 70. 爬楼梯、322. 零钱兑换、279.完全平方数

本文介绍了在LeetCode中,如何使用动态规划方法解决三个问题:爬楼梯、零钱兑换和判断一个数是否为完全平方数。通过实例展示了完全背包的思想在爬楼梯问题中的应用,以及如何通过状态转移方程求解零钱兑换和完全平方数的最优解。

70. 爬楼梯

题目链接:70. 爬楼梯 - 力扣(LeetCode)

class Solution {
    public int climbStairs(int n) {
        int[] dp = new int[n+1];
        if(n <= 2) {
            return n;
        }
        dp[0] = 1;
        for(int i = 1; i < n + 1; ++i) {
            for(int j = 1; j < 3; ++j) {
                if(i < j) {
                    break;
                }
                dp[i] += dp[i-j];
            }
        }
        return dp[n];
    }
}

使用完全背包做的爬楼梯

322. 零钱兑换

题目链接:322. 零钱兑换 - 力扣(LeetCode)

class Solution {
    public int coinChange(int[] coins, int amount) {
        if(amount == 0) {
            return 0;
        }
        int[] dp = new int[amount + 1];
        for(int i = 0; i < coins.length; ++i) {
            for(int j = coins[i]; j < amount + 1; ++j) {
                if(dp[j-coins[i]] != 0 || j - coins[i] == 0) {
                    dp[j] = dp[j] != 0 ? Math.min(dp[j], dp[j-coins[i]] + 1) : dp[j-coins[i]] + 1;
                }
            }
        }
        return dp[amount] == 0 ? -1 : dp[amount];
    }
}

279.完全平方数

题目链接:279. 完全平方数 - 力扣(LeetCode)

class Solution {
    public int numSquares(int n) {
        double x = Math.pow(n, 0.5);
        if(x % 1 == 0) {
            return 1;
        }
        int a = (int)x;
        int[] dp = new int[n + 1];
        for(int i = 1; i < a + 1; ++i) {
            for(int j = i * i; j < n + 1; ++j) {
                if(dp[j - i*i] != 0 || j - i*i == 0) {
                    dp[j] = dp[j] == 0 ? dp[j - i * i] + 1 : Math.min(dp[j], dp[j-i*i]+1);
                }
            }
        }
        return dp[n] == 0 ? -1 : dp[n];
    }
}

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值