锐单电子商城 , 一站式电子元器件采购平台!
  • 电话:400-990-0325

【LeetCode】【剑指 Offer】 10- I. 斐波那契数列 (JavaScript)

时间:2023-06-06 09:07:01 xsm吸收薄膜电容器

原题

写一个函数,输入 n ,求斐波那契(Fibonacci)数列的第 n 项(即 F(N))。斐波那契数列的定义如下:

F(0) = 0,   F(1) = 1 F(N) = F(N - 1)   F(N - 2), 其中 N > 1. 

斐波那契数列由 0 和 1 起初,斐波那契数是由之前的两数加起来的。

答案需要模具 1e9 7.如果计算初始结果为:1万万万8,请返回 1。

示例 1:

输入:n = 2 输出:1 

示例 2:

输入:n = 5 输出:5 

题解

  • 递归 (时间复杂度很好, 超时)
/** * @param {number} n * @return {number} */ var fib = function(n) { 
             if(n < 2) return n;     return (fib(n - 1)   fib(n - 2)) % (1e9   7); }; 
  • 动态规划,滚动数组思想 (空间复杂度 O(1), 时间复杂度 O(n) )
/** * @param {number} n * @return {number} */ var fib = function(n) { 
             if(n < 2) return n;     let tmp = 0;     let res = 1;     for(let i = 2; i <= n; i ) { 
                 res = res   tmp;         tmp = res - tmp;         res = res % (1e9 7); // 结果取模     }     return res; };
  • 矩阵快速幂 (空间复杂度 O(1), 时间复杂度 O(log n) )
    • 大佬题解, 超详细
/** * @param {number} n * @return {number} */
var fib = function(n) { 
        
    if(n < 2) return n;
    let m = [[1, 1], [1, 0]];
    let res = pow(m, n-1);
    return res[0][0];
};
function pow(a, n) { 
        
    let ret = [[1, 0], [0, 1]];
    while(n > 0) { 
        
        if((n&1) == 1) { 
        
            ret = multiply(ret, a);
        } 
        n >>= 1;
        a = multiply(a, a);
    }
    return ret;
}
function multiply(a, b) { 
        
    const c = [[0, 0], [0, 0]];
    for(let i = 0; i < 2; i++) { 
        
        for(let j = 0; j < 2; j++) { 
        
            c[i][j] = (BigInt(a[i][0]) * BigInt(b[0][j]) + BigInt(a[i][1]) * BigInt(b[1][j])) % BigInt(1000000007);
        }
    }
    return c;
}
锐单商城拥有海量元器件数据手册IC替代型号,打造电子元器件IC百科大全!

相关文章