青蛙跳台阶问题

    一只青蛙一次可以跳上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;
    }
};

posted @ 2015-04-15 13:06  LarryKnight  阅读(1317)  评论(0编辑  收藏  举报