[编程题][剑指 Offer 10- II. 青蛙跳台阶问题]
5、剑指 Offer 10- II. 青蛙跳台阶问题
动态规划
方法1:斐波那契递归
//方法1:普通递归[不通过,时间超限制]
public int numWays1(int n) {
if(n==0 || n==1){
return 1;
}
if (n==2){
return 2;
}else {
return (numWays(n-1)+numWays(n-2))%1000000007;
}
}
时间复杂度高,不通过,逻辑没问题
方法2:改进非递归形式解决斐波那契
//方法1:普通递归[不通过,时间超限制]
public int numWays1(int n) {
if(n==0 || n==1){
return 1;
}
if (n==2){
return 2;
}else {
return (numWays(n-1)+numWays(n-2))%1000000007;
}
}
方法3:使用数组来提高效率(动态规划)
//方式3:使用数组来提高效率[最优] 动态规划
public static int numWays(int n) {
//对于n=1和n=0的情况直接返回
if (n==0 || n==1){
return 1;
}
//n>=2的情况在此处理
int[] ints = new int[n + 1];
ints[0] = 1;
ints[1] = 1;
for (int i = 1; i < n; i++) {
ints[i+1] = ints[i]+ints[i-1]; //借助的是f(n+1) = f(n)+f(n-1)
ints[i+1] %=1000000007;
}
return ints[n];
}