【牛客网-剑指offer-刷题】Day-1 斐波那契数列

题目

大家都知道斐波那契数列,现在要求输入一个正整数n,请你输出斐波那契数列的第n项。

F(0) = 0, F(1) = 1
F(N) = F(N-1) + F(N-2), 其中 N > 1

解法1:递归法

根据斐波那契数列的标准公式,直接写出递归函数:

public class Solution {
          
   
    public int Fibonacci(int n) {
          
   
        if(n <= 1){
          
   
            return n;
        } else{
          
   
            return Fibonacci(n-1) + Fibonacci(n-2);
        }
    }
}

复杂度 时间复杂度: O ( 2 n ) O(2^n) O(2n) 空间复杂度: O ( 1 ) O(1) O(1)

解法2:优化递归

由于递归会重复计算大量相同的数据,消耗过多的内存,因此,采用将结果存入数组的方式:

public class Solution {
          
   
    public int Fibonacci(int n) {
          
   
        int arr[] = new int[n];
        arr[0] = 1;
        arr[1] = 1;
        for(int i = 2; i < n; i++){
          
   
            arr[i] = arr[i-1] + arr[i-2];
        }
        return arr[n-1];
    }
}

利用索引,将每个n的值存到对应n-1下标的数组位置中,直接根据下标索引。 复杂度 时间复杂度: O ( n ) O(n) O(n) 空间复杂度: O ( n ) O(n) O(n)

解法3:优化存储

对于这个问题来讲,每次只用到了最近的两个数,因此可以指存储最近的两个数的值。

    sum : 存储第n项的值 one 存储第 n-1 项的值 two 存储第 n-2 项的值
public class Solution {
          
   
    public int Fibonacci(int n) {
          
   
        if(n <= 1){
          
   
            return n;
        }
        int sum = 0; 
        int one = 1;
        int two = 0;
        for(int i = 2; i <= n; i++){
          
   
            sum = one + two;
            two = one;
            one = sum;
        }
        return sum;
    }
}

复杂度 时间复杂度: O ( n ) O(n) O(n) 空间复杂度: O ( 1 ) O(1) O(1)

解法4:进一步优化

观察上一版发现,sum 只在每次计算第 n 项的时候用一下,其实还可以利用 sum 存储第 n-1 项。 例如当计算完 f(5) 时 sum 存储的是 f(5) 的值,当需要计算 f(6) 时,f(6) = f(5) + f(4),sum 存储的 f(5),f(4) 存储在 one 中,由 f(5)-f(3) 得到。

public class Solution {
          
   
    public int Fibonacci(int n) {
          
   
        if(n == 0){
          
   
            return 0;
        }else if(n == 1){
          
   
            return 1;
        }
        int sum = 1;
        int one = 0;
        for(int i=2;i<=n;i++){
          
   
            sum = sum + one;
            one = sum - one;
        }
        return sum;
    }
}

复杂度 时间复杂度: O ( n ) O(n) O(n) 空间复杂度: O ( 1 ) O(1) O(1)

经验分享 程序员 微信小程序 职场和发展