【算法-LeetCode】509. 斐波那契数(递归;动态规划)

509. 斐波那契数 - 力扣(LeetCode)

发布:2021年9月24日17:16:40

问题描述及示例

斐波那契数,通常用 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

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

提示:
0 <= n <= 30

我的题解

斐波那契数列之前已经做过好几次了,这里就不再赘述了,可以看之前写的博客:

参考:【算法-剑指 Offer】10- I. 斐波那契数列(递归;动态规划)_赖念安的博客-CSDN博客

下面两道题目也是换了个包装的斐波那契数列问题:

参考:【算法-LeetCode】70. 爬楼梯(动态规划入门)_赖念安的博客-CSDN博客
参考:【算法-剑指 Offer】10- II. 青蛙跳台阶问题(动态规划)_赖念安的博客-CSDN博客

而这道题和之前做的那道题目的最大的不同就是本题不要求取模,这就使得程序更简单了;而且本题的 n 限制在了 0 <= n <= 30,所以也不用担心递归会超时了,也就是说本题是可以用递归解决并提交通过的。

我的题解1(递归)

/**
 * @param {number} n
 * @return {number}
 */
var fib = function(n) {
  // 由于递归调用的特殊性,我习惯用一个辅助函数来完成递归逻辑,但是在本题中可以不必这样写
  function fibonacci(num) {
    // 如果输入当前递归的参数为0,则返回0,因为F(0) = 0,这是递归结束条件
    if(num === 0) {
      return 0;
    }
    // 如果输入当前递归的参数为1或2,则返回1,因为F(1) = F(2)= 1,这也是递归结束条件
    // 当然,这里可以不用写num === 2的情况,这样做只是为了减少一次递归嵌套
    if(num === 1 || num === 2) {
      return 1;
    }
    // 开始用递归公式计算数列值
    return fibonacci(num-1) + fibonacci(num-2);
  }
  // 不要忘记把递归的结果返回,如果不用辅助函数,这里可以不用写
  return fibonacci(n);
};

提交记录
31 / 31 个通过测试用例
状态:通过
执行用时:88 ms, 在所有 JavaScript 提交中击败了28.57%的用户
内存消耗:37.8 MB, 在所有 JavaScript 提交中击败了24.05%的用户
时间:2021/09/24 17:30

我的题解2(动态规划)

有关动态规划的思路总结,可以看下面的博客:

参考:【算法-LeetCode】53. 最大子序和(动态规划初体验)_赖念安的博客-CSDN博客

注意下面的dp数组初始化条件中的dp[0],在这题中,dp[0]是有意义的,所以不是从dp[1]做初始化。

/**
 * @param {number} n
 * @return {number}
 */
var fib = function(n) {
  let dp = [];
  dp[0] = 0;
  dp[1] = 1;
  for(let i = 2; i <= n; i++) {
    dp[i] = dp[i-1] + dp[i-2];
  }
  return dp[n];
};


提交记录
31 / 31 个通过测试用例
状态:通过
执行用时:76 ms, 在所有 JavaScript 提交中击败了50.41%的用户
内存消耗:37.5 MB, 在所有 JavaScript 提交中击败了85.98%的用户
时间:2021/09/24 17:19

如果对递归或者动态规划的过程不大清楚,可以借助Chrome开发者工具的的逐步调试功能进行逐步观察

官方题解

更新:2021年7月29日18:43:21

因为我考虑到著作权归属问题,所以【官方题解】部分我不再粘贴具体的代码了,可到下方的链接中查看。

更新:2021年9月24日17:21:51

参考:斐波那契数 - 斐波那契数 - 力扣(LeetCode)

【更新结束】

有关参考

更新:2021年9月24日17:42:22
参考:【算法-LeetCode】53. 最大子序和(动态规划初体验)_赖念安的博客-CSDN博客
参考:【算法-剑指 Offer】10- I. 斐波那契数列(递归;动态规划)_赖念安的博客-CSDN博客
参考:【算法-LeetCode】70. 爬楼梯(动态规划入门)_赖念安的博客-CSDN博客
参考:【算法-剑指 Offer】10- II. 青蛙跳台阶问题(动态规划)_赖念安的博客-CSDN博客
参考:算法图解part3:递归&栈_catkin_ws的博客-CSDN博客

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值