- 暴力递归,时间复杂度是2^n,空间复杂度是o(n),这个也是最不推荐使用的,面试的时候肯定不让用
代码如下
class Solution {
public:
int fib(int n) {
if (n == 0 || n == 1) return n;
return fib(n - 1) + fib(n - 2);
}
};
2 直接用数组算出来前n项,一般的题目都会限制数列的长度,比如长度为101,那么可以直接求解,下面取模是因为数列后面会超过int甚至long long的范围,详细可以见leetcode,该算法时间复杂度为o(1),空间复杂度为o(n),缺点就是浪费空间
class Solution {
public:
int fib(int n) {
int a[101];
a[0] = 0, a[1] = 1;
for (int i = 2 ; i < 101; i ++ ){
a[i] = a[i - 1] + a[i - 2];
a[i] %= 1000000007;
}
return a[n];
}
};
3 leetcode称为动态规划的算法,时间复杂度为o(n), 空间复杂度为o(1),综合考虑为最佳的算法
class Solution {
public:
int fib(int n) {
if (n == 0 || n == 1) return n;
int a = 0, b = 1, sum;
for (int i = 2; i <= n; i ++){
sum = (a + b) % 1000000007;
a = b;
b = sum;
}
return b;
}
};
在面试的时候,比较推荐第二种和第三种的算法