70. 爬楼梯

Posted by CodingWithAlice on July 3, 2021

70. 爬楼梯

题目:

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

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

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

解答:

  • 方法一:自己想的

image-20210703181332655

时间复杂度:O(n),空间复杂度:xx

主要逻辑:以 2 的个数作为概率计算的循环,引用了阶乘处理方法

参考函数如右概率计算公式 img

var climbStairs = function(n) {
    let twoNum = Math.floor(n / 2); // 最多有 twoNum 个 2
    let oneNum = n % 2;// 最多有 oneNum 个 2
    // 以 2 的个数作为次数累计
    let times = 0; // 0 个 2 -- 记一次
    for(let i = 0; i <= twoNum; i++) {
        // 处理阶乘
        function factorialize(num) {
            if(num == 0){
                return 1;
            }
        return num * factorialize(num-1);
        }
        // 处理全是 1 或者全是2 - 偶数
        if (i === 0 || (i === twoNum && oneNum === 0)) {
            times += 1;
            continue
        }
        // 或者全是2,一个1 - 奇数
        if (i === twoNum && oneNum === 1) {
            times += twoNum + 1;
            continue
        }
        let top = i; //  2 的个数
        let bottom  = ((twoNum - i) * 2 + oneNum) + i; // 总的 2 和 1 的个数
        // 概率
        let plus = factorialize(bottom) / (factorialize(top) * factorialize(bottom - top));
        times += plus;

    }
    return times;
};
  • 方法二:动态规划

核心逻辑:将问题拆分成多个子问题 —> 爬第n阶楼梯的方法数量,等于 2 部分之和

  • 爬上 n - 1 阶楼梯的方法数量。因为再爬 1 阶就能到第 n 阶
  • 爬上 n - 2 阶楼梯的方法数量,因为再爬 2 阶就能到第 n 阶

分析完逻辑可以发现 —> 这已经是 斐波那契数 的算法问题了

// 贴一下官方提供的动态规划解法 -- 你猜我看懂了么?
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;
};