参考:B站UP--子烁爱学习(推荐大家观看原视频)
题目描述:

题目解析
首先按照最简单的递归来计算:时间复杂度O(2^n),空间复杂度O(1);
public int Fibonacci(int n) { if(n<=1){ return n; } return Fibonacci(n-1)+Fibonacci(n-2); }接着,由于当前项是由前两项加和得来的,所以,我们可以创建一个数组,通过不断++i,让数组存储arr[i]=arr[i-1]+arr[i-2],然后把整个数列存储起来。降低时间复杂度。时间复杂度O(n),空间复杂度O(n)。
public int Fibonacci(int n) { //创建数组,存储数列 int[] arr=new int[40]; arr[0]=0; arr[1]=1; //通过便遍历数组是的时间复杂度降低 for (int i = 2; i <=n ; i++) { arr[i]=arr[i-1]+arr[i-2]; } return arr[n]; }接着再进行优化,我们可以不考虑除了sum=fromTwo+fromOne着三个以外的数,因为,因为,我们要得到第n项,那么我们只需要直到n-1项和n-2项就可以了呀,这样就能进一步削减空间复杂度。时间复杂度O(n),空间复杂度O(1)。
public int Fibonacci(int n) { //先写出第一第二项 if(n==0){ return 0; } if(n==1){ return 1; } //建立三项关系 int sum=0; int fromTwo=0; int fromOne=1; //这样就相当于我们每次计算当前项之后,就将三项右平移一位,一直只需要记录这三项即可 for (int i = 2; i <= n; i++) { sum=fromTwo+fromOne; fromTwo=fromOne; fromOne=sum; } return sum; }