1. 程式人生 > 實用技巧 >《劍指offer》 —— 青蛙跳臺階問題

《劍指offer》 —— 青蛙跳臺階問題

點選檢視原文
點選檢視原題

題目

一隻青蛙一次可以跳上$1$級臺階,也可以跳上$2$級臺階。求該青蛙跳上一個 $n$級的臺階總共有多少種跳法。

答案需要取模 $1e9+7$($1000000007$),如計算初始結果為:$1000000008$,請返回 $1$。

提示:$n$ 的取值為 $[0, 100]$

解題思路

令 $n$ 級臺階的跳法為 $Sn$,
當 $n$ 為 $0$ 時,$S\mathop{{}}\nolimits_{{0}} = 1$
當 $n$ 為 $1$ 時,$S\mathop{{}}\nolimits_{{1}} = 1$
當 $n$ 為 $2$ 時,$S\mathop{{}}\nolimits_{{2}} = 2$
當 $n$ 為 $3$ 時,$S\mathop{{}}\nolimits_{{3}} = 3$
當 $n$ 為 $4$ 時,$S\mathop{{}}\nolimits_{{4}} = 5$
...
當臺階數為 $n$ 時,$S\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老師的前端補習班」關注我的微信公眾號,那麼就可以第一時間收到我的最新文章。