斐波那契数

时间:2022-10-08 21:57:03

LeetCode 75 学习计划适用于想为技术面试做准备但不确定应该聚焦于哪些题目的用户。学习计划中的题目都是经过精心挑选的,Level 1和 Level 2 学习计划是为初级用户和中级用户准备的,题目覆盖了大多数中层公司面试时所必需的数据结构和算法,Level 3 学习计划则是为准备面试*公司的用户准备的。​​来源​

第 10 天

​斐波那契数​

难度:简单

题目

斐波那契数 (通常用 F(n) 表示)形成的序列称为 斐波那契数列 。该数列由 0 和 1 开始,后面的每一项数字都是前面两项数字的和。也就是:

F(0) = 0,F(1) = 1

F(n) = F(n - 1) + F(n - 2),其中 n > 1

给定 n ,请计算 F(n) 。

示例 1:

输入:n = 2
输出:1
解释:F(2) = F(1) + F(0) = 1 + 0 = 1

示例 2:

输入:n = 3
输出:2
解释:F(3) = F(2) + F(1) = 1 + 1 = 2

示例 3:

输入:n = 4
输出:3
解释:F(4) = F(3) + F(2) = 2 + 1 = 3

题解

方法1:是最简单的解法但也是最耗时的解法。

// 解法1
var fib = function(N) {
if (N < 2) return N;
return fib(N - 1) + fib(N - 2);
}

方法2:从i=2开始迭代N,将第i个元素设置前两个元素的和,这样最后一个元素的值就是斐波那契数。

// 解法2
var fib = function(N) {
if ( N <= 1) return N;
const result = new Array(N);
result[0] = 0;
result[1] = 1;
for (let i = 2; i < N + 1; i++) {
result[i] = result[i - 1] + result[i - 2];
}
return result[N];
};

方法3:由于斐波那契数存在递推关系,因此可以使用动态规划求解。动态规划的状态转移方程即为上述递推关系,边界条件为 F(0) 和 F(1)。

根据状态转移方程和边界条件,可以得到时间复杂度和空间复杂度都是 O(n)的实现。由于 F(n) 只和 F(n-1) 与 F(n-2) 有关,因此可以使用「滚动数组思想」把空间复杂度优化成 O(1)。

// 解法3
var fib = function(n) {
if (n < 2) {
return n;
}
let p = 0, q = 0, r = 1;
for (let i = 2; i <= n; i++) {
p = q;
q = r;
r = p + q;
}
return r;
};

总结

滚动数组的解法太棒了,除了最常规的递归思想,滚动数组以更低的空间复杂度解题更优~