70. 爬楼梯

119 阅读1分钟

题目

假设你正在爬楼梯。需要 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

题解

先从最简单的情况考虑:

如果只有一个台阶,那只有1种走法,即走一步

如果有2个台阶,那有2种走法。

  • 第一次走一步,第二次再走一步
  • 一次走两步

如果有3个台阶,那有3种走法

  • 在第二个台阶上走一步,即一个台阶的解法
  • 在第一个台阶上,走两次一步,或者走一次两步, 即2个台阶的解法

因此,可以推导出 n 个台阶的走法公式为; 当 n > 2, f(n) = f(n - 1) + f(n-2)

代码

/**
 * @param {number} n
 * @return {number}
 */
var climbStairs = function(n) {
    // 1个台阶,只有1种走法
    let n1 = 1;
    // 2个台阶,有两种走法,两次走一步,一次走两步
    let n2 = 2;

    if (n == 1) {
        return n1;
    }

    if (n == 2) {
        return n2;
    }

    // 当有3个台阶时,即n = 3 有三种走法
    // n-1的走法 加上走一步, 即 一个台阶的走法是1种
    // n-2的走法 加上走两步, 即 两个台阶 的走法是 2种

    // 因此,可以推导出 n个台阶的走法的公式: f(n) = f(n-1) + f(n + 2); // n > 2;

    for (i = 3; i <= n; i++) {
        let tmp = n2;
        n2 = n1 + n2;
        n1 = tmp;
    }
    return n2;


};

原题链接

70. 爬楼梯