02_爬楼梯

简介: 02_爬楼梯

70. 爬楼梯

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

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

注意:给定 n 是一个正整数。

示例 1:

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

示例 2:

  • 输入: 3
  • 输出: 3
  • 解释: 有三种方法可以爬到楼顶。
  • 1 阶 + 1 阶 + 1 阶
  • 1 阶 + 2 阶
  • 2 阶 + 1 阶

【思路】

动态五部曲

定义一个一维数组来记录不同楼层的状态

1、确定dp数组及其下标的含义:

dp[i]:爬到第i层楼梯,有dp[i]种方法

2、确定递推公式

如何可以推出dp[i]呢?

从dp[i]的定义可以看出,dp[i] 可以有两个方向推出来。

首先是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]之和!

所以dp[i] = dp[i - 1] + dp[i - 2] 。

在推导dp[i]的时候,一定要时刻想着dp[i]的定义,否则容易跑偏。

这体现出确定dp数组以及下标的含义的重要性!

3、dp数组如何初始化

再回顾一下dp[i]的定义:爬到第i层楼梯,有dp[i]种方法。

那么i为0,dp[i]应该是多少呢,这个可以有很多解释,但基本都是直接奔着答案去解释的。

例如强行安慰自己爬到第0层,也有一种方法,什么都不做也就是一种方法即:dp[0] = 1,相当于直接站在楼顶。

但总有点牵强的成分。

那还这么理解呢:我就认为跑到第0层,方法就是0啊,一步只能走一个台阶或者两个台阶,然而楼层是0,直接站楼顶上了,就是不用方法,dp[0]就应该是0.

其实这么争论下去没有意义,大部分解释说dp[0]应该为1的理由其实是因为dp[0]=1的话在递推的过程中i从2开始遍历本题就能过,然后就往结果上靠去解释dp[0] = 1

从dp数组定义的角度上来说,dp[0] = 0 也能说得通。

需要注意的是:题目中说了n是一个正整数,题目根本就没说n有为0的情况。

所以本题其实就不应该讨论dp[0]的初始化!

我相信dp[1] = 1,dp[2] = 2,这个初始化大家应该都没有争议的。

所以我的原则是:不考虑dp[0]如何初始化,只初始化dp[1] = 1,dp[2] = 2,然后从i = 3开始递推,这样才符合dp[i]的定义。

4、确定遍历顺序

从递推公式dp[i] = dp[i - 1] + dp[i - 2];中可以看出,遍历顺序一定是从前向后遍历的

5、举例推导dp数组

// 常规方式
public int climbStairs(int n) {
    int[] dp = new int[n + 1];
    dp[0] = 1;
    dp[1] = 1;
    for (int i = 2; i <= n; i++) {
        dp[i] = dp[i - 1] + dp[i - 2];
    }
    return dp[n];
}
// 用变量记录代替数组
class Solution {
    public int climbStairs(int n) {
        if(n <= 2) return n;
        int a = 1, b = 2, sum = 0;
        for(int i = 3; i <= n; i++){
            sum = a + b;  // f(i - 1) + f(i - 2)
            a = b;        // 记录f(i - 1),即下一轮的f(i - 2)
            b = sum;      // 记录f(i),即下一轮的f(i - 1)
        }
        return b;
    }
}
相关文章
|
1月前
LeetCode爬楼梯
解决LeetCode上“爬楼梯”问题的动态规划方法,其中每次可以爬1或2个台阶,目标是计算到达楼顶的不同方法数。
27 0
|
3月前
|
算法 Java
LeetCode第70题爬楼梯
这篇文章是关于LeetCode第70题"爬楼梯"的解题分享。作者首先分析了题目,指出这是一个简单的问题,并且可以通过观察发现爬楼梯的规律:到达第n层楼梯的走法数等于到达第n-1层和第n-2层楼梯的走法数之和。接着,作者提供了一个Java语言的代码实现,使用了迭代的方式来计算爬楼梯的走法数。最后,作者总结了动态规划思想在解决这类问题时的应用,强调了通过观察问题找出规律的重要性。
LeetCode第70题爬楼梯
|
5月前
|
Java Go C++
Leetcode70. 爬楼梯(动态规划)
Leetcode70. 爬楼梯(动态规划)
29 0
|
6月前
leetcode-70:爬楼梯
leetcode-70:爬楼梯
48 0
leetcode:70. 爬楼梯
此题运用递归思想。当只有1个台阶,那么只有1种方法爬到楼顶——跨一个台阶;当有2个台阶时,有2种方法爬到楼顶——跨一个台阶跨两次或直接跨两个台阶。当有3个台阶或更多台阶时,则可以选择先跨一个台阶还是先跨两个台阶,剩下的台阶再进行选择是先跨一个台阶还是先跨两个台阶……从而实现递归
39 0
爬楼梯(动态规划)
假设你正在爬楼梯。需要 n 阶你才能到达楼顶。
66 0