斐波那契数列

167 阅读1分钟

暴力解法--超出时间限制,时间复杂度为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;i<= n;i++){
        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;i<=n;i++){
        let sum = (prev +curr ) % (1e9 +7);
        prev = curr
        curr = sum
    }
    return curr
};