暴力解法--超出时间限制,时间复杂度为O(2的N次方)
var fib = function(n) {
if(n == 0) return 0
if(n == 1) return 1
return (fib(n-1) + fib(n-2))%(1e9 +7);
};
优化1,带备忘录的递归解法--- 时间度复杂度O(N)
自顶向下
var dp = [0,1]
var fib = function(n) {
if(dp[n]!==undefined){
return dp[n];
}
dp[n] = fib(n-1) + fib(n-2);
return dp[n] % (1e9 +7);
};
自底向上
var dp = [0,1,1]
var fib = function(n) {
if(n<3) return dp[n]
for(let i=3
dp[i] = (dp[i-1] + dp[i-2] ) % (1e9+7)
}
return dp[n]
}
优化2,压缩空间 空间复杂度O(1)
- 因为dp[n]只与前dp[n-1]和 dp[n-2] 相关,备忘录可仅仅记录此两项
var fib = function(n) {
if(n==0) return 0
if(n==1 || n==2) return 1
let prev =1 ,curr = 1
for(let i=3
let sum = (prev +curr ) % (1e9 +7)
prev = curr
curr = sum
}
return curr
}