题目:
大家都知道斐波那契数列,现在要求输入一个整数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; } }