方法一:递归

斐波那契数列:f(n) = f(n-1) + f(n+1) (n>2)。可以将问题分解,使用递归解答。

时间复杂度:o(2n)。

空间复杂度:o(n)。递归栈深度

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

方法二:递归

上述递归会有很多重复的计算,可以利用一个数组将数列保存下来,这样可以避免递归过程的重复计算。

时间复杂度:o(n)。

空间复杂度:o(n)。递归栈深度

class Solution {
  public:
    int fn[50] = {0};
    int Fibonacci(int n) {
        if (n == 1 || n == 2)
            return 1;
        if (fn[n] > 0)
            return fn[n];

        fn[n] = Fibonacci(n - 1) + Fibonacci(n - 2);
        return fn[n];
    }
};  

方法三:动态规划

直接从最小的序列开始计算,直到得到想要序列。

时间复杂度:o(n)。

空间复杂度:o(1)。

class Solution {
  public:
    int Fibonacci(int n) {
        if (n == 1 || n == 2)
            return 1;

        int temp1 = 1;
        int temp2 = 1;
        int res;
        for (int i = 2; i < n; i++) {
            res = temp1 + temp2;
            temp1 = temp2;
            temp2 = res;
        }
        return res;
    }
};