1.题目
大家都知道斐波那契数列,现在要求输入一个整数n,请你输出斐波那契数列的第n项(从0开始,第0项为0,n<=39)。
2.我的题解
2.1 数组存储
斐波那契数列的性质不必多说。
最直观的解法是调用递归,但是显然时间复杂度为O(2^n)
,于是想着用数组存储之前的值。
class Solution {
int value[40];
public:
int Fibonacci(int n) {
value[0]=0,value[1]=1;
for(int i=2;i<=n;i++)value[i]=value[i-1]+value[i-2];
return value[n];
}
};
时间复杂度:O(n)
空间复杂度:O(n)
3.别人的题解
一山更比一山高啊,我以为优化了就沾沾自喜,评论区大佬的解法让我自惭形秽。
3.1三个int的解法
每一次仅用到两个加数与一个和数。
class Solution {
public:
int Fibonacci(int n) {
if(n==0)return 0;
if(n==1)return 1;
int sum=0,one=0,two=1;
for(int i=2;i<=n;i++){
sum=one+two;
one=two;
two=sum;
}
return sum;
}
};
时间复杂度:O(n)
空间复杂度:O(1)
3.2 两个int的解法
瓦特?还能更少?三个数具有和的关系,所以有一个数可以由另外两个推出。
class Solution {
public:
int Fibonacci(int n) {
int a=0,b=1;
while(n-->0){
b=a+b;
a=b-a;
}
return a;
}
};
时间复杂度:O(n)
空间复杂度:O(1)
4.总结与反思
(1)生命不息,优化不止。