JS算法-爬楼梯

412 阅读1分钟

本题来自leetcode 第 70 题。解题方法参考leetcode官网解答

题目描述

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

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

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

示例 1:

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

示例 2:

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

代码展示

方法一:递归

/**
 * @param {number} n
 * @return {number}
 */
var climbStairs = function(n) {
    if (n <= 2) return n;
    return climbStairs(n - 1) + climbStairs(n - 2);
};

复杂度分析:

时间复杂度:O(2^n)。

空间复杂度:O(n)。

随着n的增大,时间复杂度会指数级增大,所以通过以下方式优化。

方法二:记忆化递归

/**
 * @param {number} n
 * @return {number}
 */
var climbStairs = function(n, hash = {}) {
    if (n <= 2 && hash[n] == undefined) {
        hash[n] = n;
    }
    if (!hash[n]) {
        hash[n] = climbStairs(n - 1, hash) + climbStairs(n - 2, hash);
    }
    return hash[n];
};

复杂度分析:

时间复杂度:O(n)。

空间复杂度:O(n)。

方法三:动态规划

  • n = 1 -> 1种
  • n = 2 -> 2种
  • n = 3 -> 3种
  • n = 4 -> 5种
  • n = 5 -> 8种

实际是斐波那契数列,解法如下:

var climbStairs = function(n) {
    let p = 0, q = 0, r = 1;
    for (let i = 1; i <= n; i++) {
        p = q;
        q = r;
        r = p + q;
    }
    return r;
};

复杂度分析:

时间复杂度:O(n)。

空间复杂度:O(1)。

总结

综合来说动态规划空间复杂度方面更优。