fe-learning
fe-learning copied to clipboard
剑指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
};