牛客网剑指Offer系列——两种青蛙跳台阶
题目描述1
一只青蛙一次可以跳上1级台阶,也可以跳上2级。求该青蛙跳上一个n级的台阶总共有多少种跳法。
题目解析1
很明显可以发现jumpFloor(n)=jumpFloor(n-1)+jumpFloor(n-2),于是就写了递归,代码效率超级低,代码如下:
1
2
3
4
5
6
7
8
class Solution {
public:
int jumpFloor(int number) {
if(number==1) return 1;
if(number==2) return 2;
return (jumpFloor(number-1)+jumpFloor(number-2));
}
};
实际上,你会发现这其实是个斐波那契数列,具体解答可以参考我的矩阵快速幂解斐波那契数列。这里写出了迭代的方法,代码如下:
1
2
3
4
5
6
7
8
9
10
11
12
13
class Solution {
public:
int jumpFloor(int number) {
if(number==1) return 1;
if(number==2) return 2;
int f1=2,f2=1;
for(;number-2>0;number--){
f1+=f2;
f2=f1-f2;
}
return f1;
}
};
题目描述2
一只青蛙一次可以跳上1级台阶,也可以跳上2级……它也可以跳上n级。求该青蛙跳上一个n级的台阶总共有多少种跳法。
题目解析2
这题看起来好像比上面那题要难了不少,其实他是一个等比数列,1 2 4 8 16,2的(number-1)次方。于是写了一行代码,代码如下:
1
2
3
4
5
6
class Solution {
public:
int jumpFloorII(int number) {
return 1<<--number;
}
};