青蛙跳台阶问题
一只青蛙一次可以跳上1级台阶,也可以跳上2级。求该青蛙跳上一个n级的台阶总共有多少种跳法。
简单的讲,可以说是把一个正整数拆解出多少个1和2。
刚看到题目有的人会想直接return pow(2, number)不就行了,这是另一个问题,比如有N个抽屉,里面有放东西的情况有多少种。
还有的同学会用递归return 2*jumpFloor(n-1),这种情况说明的是有n级台阶,青蛙是super frog,它能随便跳的情况。
下面就是解决方案:
class Solution {
public:
int jumpFloor(int number) {
if(number==0){ return -1; }
if(number==1){ return 1; }
if(number==2){ return 2; }
if(number>2){return jumpFloor(number-1)+jumpFloor(number-2);}
}
};
看上去有点像斐波那契数列, 0, 1, 1, 2, 3, 5, 8, 13, 21, 34, 55, 89, 144, 233,377,610,987,1597,2584,4181,6765,10946,17711,28657,46368,可以发现当n趋向于无穷大时,前一项与后一项的比值越来越逼近黄金分割0.618。
搞算法的大牛有意见了,说这个递归算法效率太低,能整个屌一些的改进吗。我说这不就是个游戏么,何必那么认真,肠炎道,认真你就输了。算了,我还是听大牛的,认真做事,任性做人吧。duang!
那就分配出大小为n的数组去加吧,可是又弄出一些内存空间,太浪费了,现在提倡环保节约,so,经过算法君考虑,决定用三个数来回加的耍,加到n轮就行。时间复杂度O(n),空间复杂度O(1)。
class Solution 2{
public:
int jumpFloor(int number) {
if(number==0){ return -1; }
if(number==1){ return 1; }
if(number==2){ return 2; }
if(number>2){
int j1=1, j2=2, temp;
for(int i=2; i<number; i++){
temp=j1; j1=j2; j2+=temp;
}
}
return j2;
}
};