《剑指offer》 —— 青蛙跳台阶问题

448 阅读1分钟

点击查看原文
点击查看原题

题目

一只青蛙一次可以跳上11级台阶,也可以跳上22级台阶。求该青蛙跳上一个 nn级的台阶总共有多少种跳法。

答案需要取模 1e9+71e9+710000000071000000007),如计算初始结果为:10000000081000000008,请返回 11

提示:nn 的取值为 [0,100][0, 100]

解题思路

nn 级台阶的跳法为 SnSn
nn00 时,S0=1S\mathop{{}}\nolimits_{{0}} = 1
nn11 时,S1=1S\mathop{{}}\nolimits_{{1}} = 1
nn22 时,S2=2S\mathop{{}}\nolimits_{{2}} = 2
nn33 时,S3=3S\mathop{{}}\nolimits_{{3}} = 3
nn44 时,S4=5S\mathop{{}}\nolimits_{{4}} = 5
...
当台阶数为 nn 时,Sn=Sn1+Sn2n2S\mathop{{}}\nolimits_{{n}}=S\mathop{{}}\nolimits_{{n - 1}}+S\mathop{{}}\nolimits_{{n-2}}\text{(}n \ge 2\text{)}

第一版代码

根据上面推出的状态转移方程,我们很容易写出如下代码

/**
 * @param {number} n
 * @return {number}
 */
var numWays = function(n) {
    if (n === 0 || n === 1) {
        return 1
    }
    const mod = 1000000007
    const res = [1, 1]
    for (let i = 2; i <= n; i++) {
        res[i] = (res[i - 1] + res[i - 2]) % mod
    }
    return res[n]
};

优化代码

在上面的代码中我们发现,res[i] 取决于 res[i - 1]res[i - 2],所以我们大可不必使用数组,直接改用三个变量也能将代码实现:

/**
 * @param {number} n
 * @return {number}
 */
var numWays = function(n) {
    if (n === 0 || n === 1) {
        return 1
    }
    const mod = 1000000007
    let first = 1
    let second = 1
    let res = 0
    for (let i = 2; i <= n; i++) {
        res = (first + second) % mod
        first = second
        second = res
    }
    return res
};

搜索「tony老师的前端补习班」关注我的微信公众号,那么就可以第一时间收到我的最新文章。