70. 爬楼梯

动态规划

class Solution {
    public int climbStairs(int n) {

        /**
         * 因为从第一层台阶开始,初始了dp[1]和dp[2]
         * 为了避免dp[2]空指针异常,提前判断一下
         */
        if (n < 2){
            return n;
        }

        int[] dp = new int[n + 1];
        dp[1] = 1;
        dp[2] = 2;

        for (int i = 3; i <= n; i++) {
            dp[i] = dp[i - 1] + dp[i - 2];
        }

        return dp[n];
    }
}

/**
 * 时间复杂度 O(n)
 * 空间复杂度 O(n)
 */

完全背包

class Solution {
    public int climbStairs(int n) {

        int[] dp = new int[n + 1];
        dp[0] = 1;

        /**
         * 对于爬楼梯来说,一次只能爬一阶或者两阶,故物品数量就是1和2
         * 如果最大可以爬任意阶m,那么j <= m
         * 求排列,外循环背包容量,内循环物品数量
         * 注意内循环一定要从1开始,因为后面的dp[i - j]是直接用j作为物品重量,j不仅仅只是索引
         */
        for (int i = 0; i <= n; i++) {

            for (int j = 1; j <= 2; j++) {

                if (i >= j){
                    dp[i] += dp[i - j];
                }
            }
        }

        return dp[n];
    }
}

/**
 * 时间复杂度 O(n)
 * 空间复杂度 O(n)
 */

https://leetcode-cn.com/problems/climbing-stairs/

posted @   振袖秋枫问红叶  阅读(55)  评论(0编辑  收藏  举报
相关博文:
阅读排行:
· 地球OL攻略 —— 某应届生求职总结
· 周边上新:园子的第一款马克杯温暖上架
· Open-Sora 2.0 重磅开源!
· 提示词工程——AI应用必不可少的技术
· .NET周刊【3月第1期 2025-03-02】
点击右上角即可分享
微信分享提示