大家好,我是挨打的阿木木,爱好算法的前端摸鱼老。最近会频繁给大家分享我刷算法题过程中的思路和心得。如果你也是想提高逼格的摸鱼老,欢迎关注我,一起学习。
题目
剑指 Offer 10- I. 斐波那契数列
写一个函数,输入 n ,求斐波那契(Fibonacci)数列的第 n 项(即 F(N))。斐波那契数列的定义如下:
F(0) = 0, F(1) = 1
F(N) = F(N - 1) + F(N - 2), 其中 N > 1.
斐波那契数列由 0 和 1 开始,之后的斐波那契数就是由之前的两数相加而得出。
答案需要取模 1e9+7(1000000007),如计算初始结果为:1000000008,请返回 1。
示例 1:
输入: n = 2
输出: 1
示例 2:
输入: n = 5
输出: 5
提示:
0 <= n <= 100
思路
- 最简洁的方法是我们可以通过
let arr new Array(n+1)来存储每一项的值,然后从第二项开始遍历到第n项,每一项的值等于前两项之和取余, 这里需要n + 1的原因是数组是从0开始的; - 但是需要记得给第1项赋值1;
- 这样子遍历过后,数组的最后一项就是我们要求的值;
- 但实际上我们并不需要保存那么多个值,每一轮的计算只需要,前面两轮的数据做支持即可;
- 所以我们可以通过新增两个变量
prev1、prev2来记录前一轮和前两轮的值即可; - 每一轮加完后,要把上一轮的值,赋值给
prev2, 当前计算的值,作为上一轮的值。
实现
/**
* @param {number} n
* @return {number}
*/
var fib = function(n) {
if (!n) return 0;
let mod = 1000000007;
let prev2 = 0;
let prev1 = 1;
// 每一轮计算,当前值等于前两轮的值相加取余
for (let i = 2; i <= n; i++) {
let cur = (prev2 + prev1) % mod;
[prev2, prev1] = [prev1, cur];
}
return prev1;
};
结果
看懂了的小伙伴可以点个关注、咱们下道题目见。如无意外以后文章都会以这种形式,有好的建议欢迎评论区留言。