变态跳台阶
题目描述
一只青蛙一次可以跳上1级台阶,也可以跳上2级……它也可以跳上n级。求该青蛙跳上一个n级的台阶总共有多少种跳法。
解题思路
f(1) = 1
f(2) = 2= f(1) + 1
f(3) = f(2)+f(1) +1
推出 f(n) = f(n-1)+ f(n-2)+…+ f(1)+1 f(n) = 2f(n-1)
因此
序号 | 方法 |
---|---|
1 | 递归方法 |
2 | 非递归 |
3 | 推表达式 |
- 递归方法
f(n) = f(n-1)+ f(n-2)+…+ f(1)+1
public class Solution {
public int JumpFloorII(int target) {
if(1 == target){
return 1;
}else{
int sum = 0;
for(int i = 1; i < target; i++ ){
sum += JumpFloorII(i);
}
sum += 1;
return sum;
}
}
}
- 将递归转化为非递归,双重循环
public class Solution {
public int JumpFloorII(int target) {
if(0 == target){
return 0;
}
int f[] =new int[target+1];
for(int i = 1; i < target+1; i++ ){
int sum = 0;
for(int j = 1; j< i; j++){
sum += f[j];
}
f[i] = sum + 1;
}
return f[target];
}
}
- 分析出递推公式 f(n) = 2f(n-1) 因为 f(1) = 1 ,f(n) =2 ^(n-1)
public class Solution {
public int JumpFloorII(int target) {
if(0 == target){
return 0;
}else if( 1 == target){
return 1;
}else{
int f[] = new int [target + 1];
f[1] = 1;
for(int i = 2; i< target + 1;i++){
f[i] = f[i-1] * 2;
}
return f[target];
}
}
}
这次三种方法时间都很短 可能测试用例的问题
19 ms 9300K