题目描述
一只青蛙一次可以跳上1级台阶,也可以跳上2级。求该青蛙跳上一个n级的台阶总共有多少种跳法(先后次序不同算不同的结果)。
以下是本篇文章正文内容,下面案例可供参考
解题思路
- 这个题首先想到的是第一种解法:递归,是典型的斐波那契数列问题,这种方法代码简单好写,但是缺点是很慢,不在此赘述
- 还有第二种解法:循环(推荐),依次往下循环
斐波那契数列从第3项开始,每一项都等于前两项之和
0、1、1、2、3、5、8、13、21、34、……
定义一个a=1
,b=1
表示它的前两项,第三项等于a+b
,把它赋给新的a
,则这个a
的前一项为a-b
,把它赋给新的b
,循环直到target
值,返回a
。
代码如下
①递归:
public class Solution {
public int JumpFloor(int target) {
if(target == 0||target == 1) return 1;
return JumpFloor(target-1)+JumpFloor(target-2);
}
}
时间复杂度:O(n2)
②循环:
public class Solution {
public int JumpFloor(int target) {
int a = 1,b = 1;
for(int i = 1;i<target;i++){
a = a+b;
b = a-b;
}
return a;
}
}
时间复杂度:O(n)
扩展
当跳n级台阶时,相当于把问题转化为0~n-1位二进制数(每位都是1)的个数
就等于n-1位二进制数的最大值+1,即 2(n-1)
因为:X*2n=x<<n
所有:2n-1=1<<(n-1)=1<<–n
public class Solution {
public int jumpFloorII(int target) {
return 1<<--target;
}
}