leetcode 509 菲波那契数 (第 n 个斐波那契数)

这道题目的解题方法有很多,我们来介绍几种方法。

//方法一,递归版,是一种最常见的解题方法,没有任何的优化,里面存在大量的重复计算
//时间复杂度较高,实际上是一颗递归树,当N>42时,需要的时间是很久的,在实际的工程开发中
//是不可以忍受的,那么有没有可以优化的办法呢?当然有的,我们看第二种办法。
//Time:O(2^n),Space:O(n)
class Solution 
{
public:
    int fib(int N) 
    {
        if(N==0)
        {
            return 0;
        }
        else if(N==1)
        {
            return 1;
        }
        else
        {
            return fib(N-1)+fib(N-2);
        }
    }
};
//方法二,利用一个数组来保存每个斐波那契数列的值
//Time:O(n) Space:O(n)

class Solution {
public:
    int fib(int N) 
    {
        vector<int> ret(N+1,-1);//这里的数组不能用C++中的原生数组,必须用vector动态数组
        
        if(0==N) return 0;  //注意这行程序不能掉
        if(1==N) return 1;  //注意这行程序不能掉

        ret[0]=0;
        ret[1]=1;

        for(int i=2;i<=N;i++)
        {
            ret[i]=ret[i-1]+ret[i-2];
        }

        return ret[N];
    }
};

解法三:能不能把空间复杂度也优化成,O(1)呢?第三种解法对第2种解法进行改进

//解法三,这种方法应该是最优解了
//Time:O(n),Space:O(1)
class Solution {
public:
    int fib(int N) 
    {   
        if(0==N) return 0;  //注意这行程序不能掉
        if(1==N) return 1;  //注意这行程序不能掉

        int first=0;
        int second=1;

        for(int i=2;i<=N;i++)
        {
            int third=first+second;
            first=second;
            second=third;
        }

        return second;
    }
};

 

posted @ 2020-01-11 13:18  repinkply  阅读(14)  评论(0)    收藏  举报