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;
}
};

浙公网安备 33010602011771号