Offer 驾到,掘友接招!我正在参与2022春招打卡活动,点击查看活动详情。
leetcode第509题:斐波那契数。
斐波那契数列:[0,1,1,2,3,5,8,......]。数列特征是前两项的0和1,再后面每一项是前两项之和。
一、题目描述:
斐波那契数通常表示为F(n),由斐波那契数形成的序列称为斐波那契数列。n为第n项,F(n)为第n项是斐波那契数值。给定n求F(n)。也就是:
F(0) = 0;F(1) = 1 F(n) = F(n - 1) + F(n - 2) // 其中 n > 1
示例1:
输入n=2 -> 输出1
解释:F(2) = F(1) + F(0) = 1 + 0 = 1
示例 3:
输入:n = 4 -> 输出:3 解释:F(4) = F(3) + F(2) = 2 + 1 = 3
二、思路解析:
方法①:递归求值
直接使用递归方式:根据关系公式F(n) = F(n - 1) + F(n - 2)一步步往前递归至初始值0和1时计算出F(n)
方法②:缓存+递推
我们对n进行循环遍历,每次循环求出当前项的值,使用缓存来记录每一项的斐波那契数,递推出当n时直接拿前两项的值相加
三、代码
/**
* @param {number} n
* @return {number}
*/
var fib = function(n) {
// 方法一:递归
if (n==0||n==1){
return n;
}
return fib(n-1)+fib(n-2);
// 方法二:缓存+递归
let cache = []
for(let i=0;i<=n;i++){
if (i==0||i==1) {
cache[i]=i
} else {
cache[i] = cache[i-1]+cache[i-2]
}
}
return cache[n];
};
四:总结
- 直接使用递归来解题,虽然思路简单,但是涉及的计算量是很大的。
- 当使用方法二时,我们只对输入的数值n进行一遍循环,把每次的斐波那契数都存下来,当n项的时候我们自然可以直接取前两项求和了。只进行了一遍循环操作,时间复杂度为0(n)。