首先用递归的方法实现,发现时间复杂度不是很理想
接下来尝试维护一个数组,计算出所有的数字,最后取数,发现空间复杂度太高,
最后思考能否在第二种方法的基础上降低空间复杂度,仅仅维护两个元素的数组
class Solution {
public:
int fib(int n) {
if(n < 2) return n;
vector<int> val(2);
val[0] = 0;
val[1] = 1;
int k = 0;
for(int i = 2; i <= n; i++){
k = k%2;
val[k] = val[0] + val[1];
k++;
}
return val[k-1];
}
};
时间复杂度,空间复杂度如下:
就是用一个k记录需要更新的数字下标,可以剔除其他不需要的元素,仅仅保留目标值和目标值的前一个值。