本质就是斐波那契,变化的只是初始值,有递归版本和迭代版本,两种版本都要熟练掌握
方法一: 递推
开一个大数组,记录每个数的值。用循环递推计算。
总共计算 n 个状态,所以时间复杂度和空间复杂度都是 O(n)。
var climbStairs = function(n) {
// 1 2 3 5
// 1 2 3 4
if (n <= 2) return n;
let f = [0,1,2];
for (let i = 3; i <= 45; i ++) {
f[i] = f[i - 1] + f[i - 2];
}
return f[n];
};
方法二:递归+滚动变量。
仔细观察我们会发现,递推时我们只需要记录前两项的值即可,没有必要记录所有值,所以我们可以用滚动变量递推。
时间复杂度还是 O(n),但空间复杂度变成了 O(1)。
var climbStairs = function(n) {
// 1 2 3 5 8
if (n <= 2) return n;
let a = 1, b = 2;
for (let i = 3; i <= n; i ++) {
var c = a + b;
a = b;
b = c;
}
return c;
};