leet_code-爬楼梯

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

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

经过观察
0阶 1种
1阶 1种
2阶 2种
3阶 3种
4阶 5种
这是一个典型的斐波那契数列
第一种方法:循环解决

/**
 * @param {number} n
 * @return {number}
 */
var climbStairs = function(n) {
    let temp = [];
    temp[0] = 1;
    temp[1] = 1;
    temp[2] = 2;
    temp[3] = 3;
    //temp[4] = 5;
    //1111 112 121 211 22  
    if(n < 4){
        return temp[n];
    }else{
        for(let i = 4; i <= n;i++){
            temp[i] = temp[i - 1] + temp[i - 2];
        }
        return temp[n];
    }
};

第二种方法-递归

/**
 * @param {number} n
 * @return {number}
 */
function test(n){
    if(n == 0||n == 1)
        return 1;
    else
        return test(n - 1) + test(n - 2)
}
var climbStairs = function(n) {
    let temp = [];
    temp[0] = 1;
    temp[1] = 1;
    temp[2] = 2;
    temp[3] = 3;
    //temp[4] = 5;
    //1111 112 121 211 22  
    if(n < 4){
        return temp[n];
    }else{
        // for(let i = 4; i <= n;i++){
        //     temp[i] = temp[i - 1] + temp[i - 2];
        // }
        // return temp[n];
        return test(n);

    }
};

递归的确可以用,但是耗时太长了,所以不如直接for循环

第三种方法-公式

/**
 * @param {number} n
 * @return {number}
 */
var climbStairs = function(n) {
    let number5 = Math.sqrt(5);
    let fibn = Math.pow((1 + number5) / 2, n + 1) - Math.pow((1 - number5) / 2, n + 1);
    return fibn/number5;
};

你可能感兴趣的:(leet_code-爬楼梯)