【剑指offer】 爬楼梯

  |   0 评论   |   0 浏览

题目

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

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

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

我的答案

/**
 * @param {number} n
 * @return {number}
 */
var climbStairs = function (n) {
    if (n < 3) {
        return n;
    }
    let prePre = 1;
    let pre = 2;
    for (let i = 3; i < n; i++) {
        const temp = pre;
        pre = pre + prePre;
        prePre=temp;
    }
    return prePre + pre;
};

这是一个典型斐波那契数列。(用递归会有很多冗余计算)

除了斐波那契数列的方法,还有一个方法就是快速幂。

这里扩展一下快速幂。

题目: 求m^n 。求m的n次方。

解法思路,用尽量少的次数算到结果,不去冗余计算。

var climbStairs = function (n) {
    let m = 4;

    let ans = 1;
    let x = m;
    while(n) {
        let a = n%2;
        n = parseInt(n/2)
        if(a) ans *= x;
        x = x*x;
    }
    return ans;
};

将n的每个二进制位作为系数,x记录当前m的n次方。


标题:【剑指offer】 爬楼梯
作者:limanting
地址:https://blog.manxiaozhi.com/articles/2021/09/25/1632554521123.html