《劍指offer》 —— 青蛙跳臺階問題
阿新 • • 發佈:2020-09-19
題目
一隻青蛙一次可以跳上$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老師的前端補習班」關注我的微信公眾號,那麼就可以第一時間收到我的最新文章。