力扣-509斐波那契数(js)

LeetCode第509题斐波那契数(js实现思想参考up JS老毕)

    • 题目
    • 解题思想(动态规划)
    • 代码

题目

斐波那契数,通常用 F(n) 表示,形成的序列称为斐波那契数列。该数列由 0 和 1 开始,后面的每一项数字都是前面两项数字的和。也就是:

F(0) = 0, F(1) = 1
F(N) = F(N - 1) + F(N - 2), 其中 N > 1.
给定 N,计算 F(N)。

示例 1:

输入:2
输出:1
解释:F(2) = F(1) + F(0) = 1 + 0 = 1.
示例 2:

输入:3
输出:2
解释:F(3) = F(2) + F(1) = 1 + 1 = 2.
示例 3:

输入:4
输出:3
解释:F(4) = F(3) + F(2) = 2 + 1 = 3.

提示:

0 ≤ N ≤ 30

来源:力扣(LeetCode)
链接:https://leetcode-cn.com/problems/fibonacci-number
著作权归领扣网络所有。商业转载请联系官方授权,非商业转载请注明出处。

解题思想(动态规划)

1.动态规划的基本思想:
动态规划算法通常用于求解具有某种最优性质的问题。在这类问题中,可能会有许多可行解。每一个解都对应于一个值,我们希望找到具有最优值的解。动态规划算法与分治法类似,其基本思想也是将待求解问题分解成若干个子问题,先求解子问题,然后从这些子问题的解得到原问题的解。与分治法不同的是,适合于用动态规划求解的问题,经分解得到子问题往往不是互相独立的。若用分治法来解这类问题,则分解得到的子问题数目太多,有些子问题被重复计算了很多次。如果我们能够保存已解决的子问题的答案,而在需要时再找出已求得的答案,这样就可以避免大量的重复计算,节省时间。我们可以用一个表来记录所有已解的子问题的答案。不管该子问题以后是否被用到,只要它被计算过,就将其结果填入表中。这就是动态规划法的基本思路。具体的动态规划算法多种多样,但它们具有相同的填表格式 。
2.在这题中我们采用动态规划的思想做,从下而上,先求解子问题,如下图所示:力扣-509斐波那契数(js)_第1张图片
我们已知f(1)和f(0)的值,然后挨个求解f(2),f(3)等。我们创建一个数组,将f(0),f(1)等的值存入,每当求解出一个该数组中没有的值,都将这个值存入数组中,以此来避免重复计算。每当计算后面的值,要用到之前出现过的值时,我们都从该数组中进行调用,然后再存入新的,如此循环往复。

代码

// atom-one-night
var  fib = function(N) {
     
  if (N <= 1){
     
    return N;
  }

  const cache = [];
  cache[0] = 0;
  cache[1] = 1;

  function memoize(number){
     
    if(cache[number] !== undefined){
     
      return cache[number];
    }

    cache[number] = memoize(number -1) + memoize(number -2);
    return cache[number];
  }
  
  const result = memoize(N);
  return result;
}

你可能感兴趣的:(算法,动态规划)