码迷,mamicode.com
首页 > 其他好文 > 详细

编程练习_跳台阶

时间:2016-06-13 18:51:07      阅读:130      评论:0      收藏:0      [点我收藏+]

标签:

/**
*题目:
*一只青蛙一次可以跳上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;
    }
};

  

 

 

 

 

 

 

  

编程练习_跳台阶

标签:

原文地址:http://www.cnblogs.com/cwq2014/p/5581308.html

(0)
(0)
   
举报
评论 一句话评论(0
登录后才能评论!
© 2014 mamicode.com 版权所有  联系我们:gaon5@hotmail.com
迷上了代码!