本题来自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)。
总结
综合来说动态规划空间复杂度方面更优。