题目:
大家都知道斐波那契数列,现在要求输入一个整数n,请你输出斐波那契数列的第n项(从0开始,第0项为0,第1项是1)。n<=39
思路:
方法一:递归
评价:代码简单,但是运行速度慢;时间复杂度O(2^n),空间复杂度:O(1)
public class Solution {
public int Fibonacci(int n) {
if(n==0||n==1) return n;
return Fibonacci(n-1)+Fibonacci(n-2);
}
}方法二:优化递归 空间换时间
评价:速度快很多;时间复杂度O(n),空间复杂度O(n)
public class Solution {
public int Fibonacci(int n) {
int res[]=new int[40];//事先告知n<=36
res[0]=0;
res[1]=1;
for(int i=2;i<=n;i++){
res[i]=res[i-1]+res[i-2];//数组存下每次的结果
}
return res[n];
}
}
方法三:优化存储 继续优化空间
思路:实际每次只需要存储上一次的第(n-1)个数,以及计算结果
评价:降低了方法二的空间复杂度;时间复杂度O(n),空间复杂度O(1)
public class Solution {
public int Fibonacci(int n) {
if(n==0||n==1) return n;
int first=0;//存储(n-1)值
int second=1;//存储计算(n)结果
int sum=0;//存储结果
for(int i=2;i<=n;i++){
sum=first+second;
first=second;
second=sum;
}
return sum;
}
}方法四:持续优化存储
思路:其实不需要sum来存储结果,因为second就是结果,那么first=seond-first
评价:时间复杂度O(n),空间复杂度O(1)
public class Solution {
public int Fibonacci(int n) {
if(n==0||n==1) return n;
int first=0;//存储(n-1)值
int second=1;//存储计算(n)结果
for(int i=2;i<=n;i++){
second=first+second;
first=second-first;
}
return second;
}
}
京公网安备 11010502036488号