题目
一只青蛙一次可以跳上(1)级台阶,也可以跳上(2)级台阶。求该青蛙跳上一个 (n)级的台阶总共有多少种跳法。
答案需要取模 (1e9+7)((1000000007)),如计算初始结果为:(1000000008),请返回 (1)。
提示:(n) 的取值为 ([0, 100])
解题思路
令 (n) 级台阶的跳法为 (Sn),
当 (n) 为 (0) 时,(Smathop{{}}
olimits_{{0}} = 1)
当 (n) 为 (1) 时,(Smathop{{}}
olimits_{{1}} = 1)
当 (n) 为 (2) 时,(Smathop{{}}
olimits_{{2}} = 2)
当 (n) 为 (3) 时,(Smathop{{}}
olimits_{{3}} = 3)
当 (n) 为 (4) 时,(Smathop{{}}
olimits_{{4}} = 5)
...
当台阶数为 (n) 时,(Smathop{{}}
olimits_{{n}}=Smathop{{}}
olimits_{{n - 1}}+Smathop{{}}
olimits_{{n-2}} ext{(}n ge 2 ext{)}
)
第一版代码
根据上面推出的状态转移方程,我们很容易写出如下代码
/**
* @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老师的前端补习班」关注我的微信公众号,那么就可以第一时间收到我的最新文章。