题目描述:
一只青蛙一次可以跳上1级台阶,也可以跳上2级台阶。求该青蛙跳上一个 n 级的台阶总共有多少种跳法。
答案需要取模 1e9+7(1000000007),如计算初始结果为:1000000008,请返回 1。
示例 1:
输入:n = 2
输出:2
示例 2:输入:n = 7
输出:21
示例 3:输入:n = 0
输出:1
提示:0 <= n <= 100
解题思路一: 递归,寻找规律可得问题类似于斐波拉切数列f(n)=f(n-1)+f(n-2),但不同点出发点的初始值不同,f(0)=1,f(1)=1,f(2)=2
public static int numWays(int n) {
if(n==0||n==1){
return 1;
}else if(n==2){
return n;
}
return (numWays(n-1)+numWays(n-2))%1000000007;
}
思路二:增加一个记录重复计数的数字对应的数值,用一个数组记录,返回相应下标对应的值
public int numWays(int n) {
int[] menWay = new int[101];
menWay[0] = 1;
menWay[1] = 1;
return ways(menWay,n);
}
public static int ways(int[] menWay,int n){
if (menWay[n]!=0){
return menWay[n];
}
menWay[n] = (ways(menWay,n-1)+ways(menWay,n-2))%1000000007;
return menWay[n];
}
思路三:动态规划,用三个变量存放阶梯值的变化 ,利用辅助变量 sumsum 使 a,b 两数字交替前进即可,因为节省了 dp 列表空间,因此空间复杂度降至 O(1)
public static int numWays(int n) {
int a=1,b=1,sum = 0;
for(int i=0;i<n;i++){
sum=(a+b)%1000000007;
a = b;
b = sum;
}
return a;
}
作者:jyd
链接:https://leetcode-cn.com/problems/qing-wa-tiao-tai-jie-wen-ti-lcof/solution/mian-shi-ti-10-ii-qing-wa-tiao-tai-jie-wen-ti-dong/