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
我的题解
斐波那契数列之前已经做过好几次了,这里就不再赘述了,可以看之前写的博客:
下面两道题目也是换了个包装的斐波那契数列问题:
参考:【算法-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(动态规划)
有关动态规划的思路总结,可以看下面的博客:
注意下面的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
【更新结束】
有关参考
更新:2021年9月24日17:42:22
参考:【算法-LeetCode】53. 最大子序和(动态规划初体验)_赖念安的博客-CSDN博客
参考:【算法-剑指 Offer】10- I. 斐波那契数列(递归;动态规划)_赖念安的博客-CSDN博客
参考:【算法-LeetCode】70. 爬楼梯(动态规划入门)_赖念安的博客-CSDN博客
参考:【算法-剑指 Offer】10- II. 青蛙跳台阶问题(动态规划)_赖念安的博客-CSDN博客
参考:算法图解part3:递归&栈_catkin_ws的博客-CSDN博客