力扣----11. 爬楼梯(JavaScript实现)

题目描述:

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

JavaScript实现:

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

时间复杂度:

空间复杂度:O(1)

/**
 * @param {number} n
 * @return {number}
 */

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

动态规划

时间复杂度:O(n)

空间复杂度:O(n)

var climbStairs = function(n) {
    const res = [];
    res[0] = 1;
    res[1] = 1;
    for(let i=2;i<=n;i++) {
        res[i] = res[i-1] +res[i-2]
    }
    return res[n];
};

正常思路

时间复杂度:O(n)

空间复杂度:O(1)

var climbStairs = function(n) {
    if(n ===1 || n===0){
        return 1;
    }else{
        var pre = 1;
        var cur = 1;
        for(var i = 2; i <= n; i++){
            cur = pre + cur;
            pre = cur - pre;
        }
        return cur
    }
}

递归

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

不推荐

var climbStairs = function(n) {
    let res = 0;
    if(n === 1 || n===0) return 1;
    if(n>1){
        res = climbStairs(n-1) + climbStairs(n-2)
    }
    return res;
};
原文地址:https://www.cnblogs.com/manru75/p/13097592.html