编程练习_跳台阶

/**
*题目:
*一只青蛙一次可以跳上1级台阶,也可以跳上2级。求该青蛙跳上一个n级的台阶总共有多少
*种跳法。
*解析:
*用动态规划的思想分析可以得出本质是一个求斐波那契级数的问题,求斐波那契级数很简单,不用像动态规划一样开辟数组。迭代的向后计算即可:时间复杂度O(n),空间复杂度O(1);
*/
class Solution {
public:
    int jumpFloor(int number) {
        int f1=0,f2=1,f3;
        if(number<=1)return 1;
        for(int i=1;i<=number;i++){
            f3=f1+f2;
            f1=f2;
            f2=f3;
        }
        return f3;
    }
};

题目加大难度:

/**
*题目:
*一只青蛙一次可以跳上1级台阶,也可以跳上2级……它也可以跳上n级。求该青蛙跳上一个n
*级的台阶总共有多少种跳法。
*解析:
*根据上一个题目:青蛙只跳1或2可以得出是一个斐波那契问题,即a[n]=a[n-1]+a[n-2],
*那么能跳1,2,3个台阶时a[n]=a[n-1]+a[n-2]+a[n-3],......
*依次类推,能推出本题的a[n]=a[n-1]+a[n-2]+......+a[1];由此得出代码:
*/
class Solution {
public:
    int jumpFloorII(int number) {
        int *a=new int[number+1];
        a[0]=1;
        a[1]=1;
        for(int i=2;i<=number;i++){
            a[i]=0;
            for(int j=i-1;j>=0;j--){
                a[i]+=a[j];
            }
        }
        return a[number];
    }
};
/**
*但是上述代码时间复杂度达到O(n^2),空间复杂度也达到O(n),重新看一下上述结论:
*a[n]=a[n-1]+a[n-2]+......+a[1];..........................(1)
*a[n-1]=     a[n-2]+......+a[1];..........................(2)
*两式相减可知:a[n]=2*a[n-1];
*所以代码进一步简化:
*/
class Solution {
public:
    int jumpFloorII(int number) {
        int f=1,fn=1;
        for(int i=2;i<=number;i++){
            fn=2*f;
            f=fn;
        }
        return fn;
    }
};

  

 

 

 

 

 

 

  

posted @ 2016-06-13 17:17  强子GOR  阅读(683)  评论(0)    收藏  举报