算法刷题笔记-斐波那契数列

129 阅读1分钟

参考: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;
          }