您现在的位置是:首页 >技术交流 >leetcode 70. 爬楼梯网站首页技术交流

leetcode 70. 爬楼梯

富有一文 2024-06-17 10:22:31
简介leetcode 70. 爬楼梯

题目详情

假设你正在爬楼梯。需要 n 阶你才能到达楼顶。

每次你可以爬 1 或 2 个台阶。你有多少种不同的方法可以爬到楼顶呢?

示例 1:
输入:n = 2
输出:2
解释:有两种方法可以爬到楼顶。
1 阶 + 1 阶
2 阶

示例 2:
输入:n = 3
输出:3
解释:有三种方法可以爬到楼顶。
1 阶 + 1 阶 + 1 阶
1 阶 + 2 阶
2 阶 + 1 阶
leetcode70

方法一:递归解决

递归方法解决主要是注意递归出口和递归主体的写法,递归本身效率不高,会计算更多的操作。

    public int climbStairs(int n) {
        if (n == 1 || n == 2) {
            return n;
        } else {
            return climbStairs(n-1) + climbStairs(n - 2);
        }
    }

在这里插入图片描述
但是本题用递归的方法由于效率太低,会导致超运行时间

方法二:动态规划之带备忘录实现

动态规划五步走解题:动态规划理论基础

1、确定dp数组以及下标的含义
dp[i]的定义为:第i个数的爬楼梯种数是dp[i]

2、确定递推公式

首先是dp[i - 1],上i-1层楼梯,有dp[i - 1]种方法,再上一个台阶就是dp[i]。
然后dp[i - 2],上i-2层楼梯,有dp[i - 2]种方法,再上二个台阶就是dp[i]。
所以dp[i] = dp[i - 1] + dp[i - 2]

3、dp数组如何初始化
题目给好dp[1] = 1,dp[2] = 2

4、确定遍历顺序
dp[i]是依赖 dp[i - 1] 和 dp[i - 2],那么遍历的顺序一定是从前到后遍历的

5、举例推导dp数组
按照这个递推公式dp[i] = dp[i - 1] + dp[i - 2],当N为5的时候,dp数组应该是如下的数列:
1 2 3 5 8

public int climbStairs(int n) {
        int dp [] = new int[n + 1];  // 这里初始化为n+1,不使用n=0这个位置
        int method_numbers = 0;
        // 边界初始条件
        if (n == 1 || n == 2) {
            return n;
        }
        // dp数组初始化
        dp[1] = 1;
        dp[2] = 2;

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

方法三:动态规划之自底向上法推导法

每次推导过程中记录前面两个位置的值即可。

public int climbStairs(int n) {
        // 边界初始条件
        if (n == 1 || n == 2) {
            return n;
        }
        // dp数组初始化
        int dp_1 = 1;
        int dp_2 = 2;
        int result = 0;  // 存储返回值

        for (int i = 3; i <= n; i++) {
            result = dp_1 + dp_2;
            // 推理更新
            dp_1 = dp_2;
            dp_2 = result;
        }
        return result;
    }

这个方法需要记录2个单位的存储,效率最高。

ps:计划每日更新一篇博客,今日2023-05-15,日更第二十九天。
昨日更新:

leetcode 509. 斐波那契数

风语者!平时喜欢研究各种技术,目前在从事后端开发工作,热爱生活、热爱工作。