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

这篇博客介绍了如何利用动态规划解决力扣上的斐波那契数问题。通过动态规划避免了重复计算,提高了效率。解题思路包括详细解释动态规划的思想,并展示了使用JavaScript编写的代码示例。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

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.在这题中我们采用动态规划的思想做,从下而上,先求解子问题,如下图所示:在这里插入图片描述
我们已知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;
}
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值