题目描述
一只青蛙一次可以跳上1级台阶,也可以跳上2级。求该青蛙跳上一个n级的台阶总共有多少种跳法(先后次序不同算不同的结果)。
解题思路
- 当台阶只有一级时,青蛙只用跳一次,只有一种方法。
- 当台阶有两级时,青蛙可以一次两级或者两次一级,所以有两种方法。
- 当台阶有三级时,可以发现有三种方法,以此类推。
- 当台阶有n级时,我们假设有f(n)种解法。当第一次跳一级阶梯,即剩下(n-1)级阶梯,就有f(n-1)种解法。所以当第一次跳两级阶梯时,剩下就有f(n-2)种解法。因为不管n是多少,第一次只能跳一级或者两级,所以f(n)=f(n-1)+f(n-2)。
- 到这里就很明显是斐波拉契数列了,但是我还是只首先想到了用递归去求解。
public class Solution {
public int JumpFloor(int target) {
if(target == 1){
return 1;
}else if(target == 2){
return 2;
}else{
return JumpFloor(target - 1) + JumpFloor(target - 2);
}
}
}
解完提交发现
可以看到和上题斐波拉契数列几乎一样,递归耗时459ms。
循环求解
所以我们再次使用循环求解解答此题
javapublic class Solution {
public int JumpFloor(int target) {
int result = 0;
int prepre_num = 1;
int pre_num = 2;
if(target == 1){
return 1;
}else if(target == 2){
return 2;
}else{
for(int i = 3;i<=target;i++){
result = prepre_num + pre_num;
prepre_num = pre_num;
pre_num = result;
}
}
return result;
}
}
效果如下
可以发现运行时间又下降到只有13ms,所以我们以后遇到斐波拉契数列问题可以基本使用循环来求解。