leetcode -- 70. 爬楼梯

44 阅读2分钟

持续创作,加速成长!这是我参与「掘金日新计划 · 10 月更文挑战」的第11天,点击查看活动详情

题目

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

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

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

  1. 1 阶 + 1 阶
  2. 2 阶 示例 2:

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

  1. 1 阶 + 1 阶 + 1 阶
  2. 1 阶 + 2 阶
  3. 2 阶 + 1 阶  

提示:

1 <= n <= 45

解答方法

第一种

如果观察数学规律,可知本题是斐波那契数列,那么用斐波那契数列的公式即可解决问题

var climbStairs = function(n) {
    const sqrt_5 = Math.sqrt(5);
    const fib_n = Math.pow((1 + sqrt_5) / 2, n + 1) - Math.pow((1 - sqrt_5) / 2,n + 1);
    return Math.round(fib_n / sqrt_5);
};

第二种

标签:动态规划 本问题其实常规解法可以分成多个子问题,爬第n阶楼梯的方法数量,等于 2 部分之和

爬上 n-1n−1 阶楼梯的方法数量。因为再爬1阶就能到第n阶 爬上 n-2n−2 阶楼梯的方法数量,因为再爬2阶就能到第n阶 所以我们得到公式 dp[n] = dp[n-1] + dp[n-2]dp[n]=dp[n−1]+dp[n−2] 同时需要初始化 dp[0]=1dp[0]=1 和 dp[1]=1dp[1]=1
时间复杂度:O(n)O(n)

var climbStairs = function(n) {
    let arr = new Array(n+1).fill(0);
    arr[0] = 1
    arr[1] = 1
    for(i=2;i<arr.length;i++){
        [arr[0],arr[1]] = [arr[1],arr[0]+arr[1]]
    }
    return arr[1]
}

第三种

基于第二种得另外一种解法,从递推公式dp[i] = dp[i - 1] + dp[i - 2];中可以看出,遍历顺序一定是从前向后遍历的

var climbStairs = function(n) {
    if(n==0 || n==1){
        return 1
    }
    let dp = [1,1]
    for(let i =2;i<=n;i++){
       dp[i] = dp[i-1]+dp[i-2]
    }
    return dp[n];
}