LeetCode 70. 爬楼梯

137 阅读2分钟

题目

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

每次你可以爬 1 或 2 个台阶。你有多少种不同的方法可以爬到楼顶呢?( 只考虑最多 45 层

示例 1:

输入:2 输出:2 解释:有两种方法可以爬到楼顶

  1. 1 步 + 1 步
  2. 2 步

示例 2:

输入:3 输出:3 解释:有三种方法可以爬到楼顶。

  1. 1 步 + 1 步 + 1 步
  2. 1 步 + 2 步
  3. 2 步 + 1 步

提示:

1 <= n <= 45

题解1:

这是一道比较经典的动态规划问题。

可以使用递归来解决,但是递归的时间复杂度很高,会超时。

因此,我们可以使用动态规划的思想进行优化。

具体来说,我们可以使用一个数组 dp 来保存每一步的结果。其中,dp[i] 表示到达第 i 步的方法数。递推公式为:dp[i] = dp[i-1] + dp[i-2]。因为到达第 i 步只有两种方法,要么从第 i-1 步跨一步到达,要么从第 i-2 步跨两步到达。

代码实现:

var climbStairs = function(n) {
    if (n <= 2) {
        return n;
    }
    let dp = new Array(n + 1).fill(0);
    dp[1] = 1;
    dp[2] = 2;
    for (let i = 3; i <= n; i++) {
        dp[i] = dp[i-1] + dp[i-2];
    }
    return dp[n];
};

题解2:

到达第 n 级台阶的方法数 = 到达第 n-1 级台阶的方法数 + 到达第 n-2 级台阶的方法数

你得先理解上面这个

走 1 个阶梯,只有 1 个方法(1 次 1 步)

走 2 个阶梯,只有 2 个方法 (2 次 1 步)(1 次 2 步)

走 3 个阶梯,只有 2 个方法 (3 次 1 步)(先 2 步再 1 步)(先 1 步再 2 步)

到达 3 阶的方法数 = 到达 2 阶的方法数 + 到达 1 阶的方法数

到达 n 阶的方法数 = 到达 n-1 阶的方法数 + 到达 n-2 阶的方法数

想到斐波那契数列了吗???

那我们可以把爬楼梯想成这样 [1,2,3,5,8,13,21,34,55] ,数组的最后一位就是答案

代码实现:

var climbStairs = function(n) {
      let arr = [1,2,3]
      let res;
      for(let i=1;i<=n;i++){

        if (i===1 || i=== 2 ||i=== 3){ 
           res = i
        }else{
               arr.push(arr[arr.length-1] + arr[arr.length-2])
               res = arr[arr.length-1]
           }
      }
       return  res
};