难度:简单 来源:509. 斐波那契数
斐波那契数,通常用 F(n) 表示,形成的序列称为 斐波那契数列 。该数列由 0 和 1 开始,后面的每一项数字都是前面两项数字的和。也就是:
代码语言:javascript复制F(0) = 0,F(1) = 1
F(n) = F(n - 1) F(n - 2),其中 n > 1
给你 n ,请计算 F(n) 。
示例 1:
代码语言:javascript复制输入:2
输出:1
解释:F(2) = F(1) F(0) = 1 0 = 1
示例 2:
代码语言:javascript复制输入:3
输出:2
解释:F(3) = F(2) F(1) = 1 1 = 2
示例 3:
代码语言:javascript复制输入:4
输出:3
解释:F(4) = F(3) F(2) = 2 1 = 3
“提示:0 <= n <= 30
题解一:递归
代码语言:javascript复制var fib = function(n) {
if (n < 2) return n
return fib(n - 2) fib(n - 1)
}
- 时间复杂度:
- 空间复杂度:
题解二:动态规划
代码语言:javascript复制/**
* @param {number} n
* @return {number}
*/
var fib = function(n) {
if (n < 2) {
return n
}
let prev = 0, curr = 1, sum
for (let i = 2; i <= n; i ) {
sum = prev curr
prev = curr
curr = sum
}
return sum
};
- 时间复杂度:
- 空间复杂度:
题解三:数学通项公式
代码语言:javascript复制/**
* @param {number} n
* @return {number}
*/
var fib = function(n) {
const sqrt5 = Math.sqrt(5);
const fibN = Math.pow((1 sqrt5) / 2, n) - Math.pow((1 - sqrt5) / 2, n);
return Math.round(fibN / sqrt5)
}
- 时间复杂度:
- 空间复杂度:
解法四:缓存
代码语言:javascript复制var fib = function(n) {
if (n < 2) {
return n
}
let cache = [0, 1]
for (let i = 2; i <= n; i ) {
cache[i] = cache[i - 2] cache[i - 1]
}
return cache[n]
}
- 时间复杂度:
- 空间复杂度: