1 题目
一只青蛙一次可以跳上1级台阶,也可以跳上2级台阶。求该青蛙跳上一个 n 级的台阶总共有多少种跳法。
答案需要取模 1e9+7(1000000007),如计算初始结果为:1000000008,请返回 1。
示例 1:
输入:n = 2
输出:2
示例 2:
输入:n = 7
输出:21
提示:
0 <= n <= 100
来源:力扣(LeetCode)
链接:https://leetcode-cn.com/problems/qing-wa-tiao-tai-jie-wen-ti-lcof
著作权归领扣网络所有。商业转载请联系官方授权,非商业转载请注明出处。
2 Java
2.1 方法一(回溯正向递归,超时)
显然超时,就是练手
class Solution {
int ans = 0;
public int numWays(int n) {
helper(0, n);
return ans;
}
// step当前位置,n目标位置
public void helper(int step, int n){
// if判断是否记录结果
if(step == n){
ans = (ans + 1) % 1000000007;
return;
}
if(step > n) return;
// for循环多路选择
helper(step + 1, n);
helper(step + 2, n);
}
}
2.2 方法二(动归逆向递归)
class Solution {
int[] memo;
public int numWays(int n) {
if(n < 2) return 1;
// 创建备忘录,初始化
memo = new int[n + 1];
memo[0] = 1; memo[1] = 1;
return helper(n);
}
public int helper(int n){
// if判断是否有记录
if(memo[n] != 0) return memo[n];
// for循环多路选择
memo[n] = (helper(n - 1) + helper(n - 2)) % 1000000007;
return memo[n];
}
}
2.3 方法三(动归正向迭代)
class Solution {
public int numWays(int n) {
if(n < 2) return 1;
// 创建备忘录,初始化
int[] dp = new int[n + 1];
dp[0] = 1; dp[1] = 1;
// 向前步进
for(int i = 2; i <= n; i++){
dp[i] = (dp[i - 1] + dp[i - 2]) % 1000000007;
}
return dp[n];
}
}