II. 青蛙跳台阶问题
题目描述:
一只青蛙一次可以跳上1级台阶,也可以跳上2级台阶。求该青蛙跳上一个 n 级的台阶总共有多少种跳法。
答案需要取模 1e9+7(1000000007),如计算初始结果为:1000000008,请返回 1。
示例:
输入: n = 2
输出: 2
输入: n = 7
输出: 21
解法
// 递归 青蛙到答某个台阶有两种方法 要么从前一个台阶跳一步上来 要么从前两个台阶跳两不上来--会超时
var numWays = function(n) {
if(n===0){
return 1;
}else if(n===1){
return 1
}else {
return numWays(n-1)+numWays(n-2)
}
};
//动态规划 利用数组缓存每一次的结果
var numWays = function(n) {
if(n===0){
return 1;
}else if(n===1){
return 1
}else {
let res=[1,1];
for(let i=2;i<=n;i++){
res.push((res[i-1]+res[i-2])%1000000007)
}
return res[n];
}
};
//动态规划 去掉数组 用基本数据类型缓存前两次的结果
var numWays = function(n) {
if(n===0){
return 1;
}else if(n===1){
return 1
}else {
let prev=1,prevT=1;
for(let i=2;i<=n;i++){
let temp=(prev+prevT)%1000000007
prevT=prev;
prev=temp;
}
return prev;
}
};
感悟
暴力递归不是最好的方法 要用些更为巧妙的方法解决问题 非必要不递归