509. 斐波那契数
简单
相关标签
premium lock icon
相关企业
斐波那契数 (通常用 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
提示:
0 <= n <= 30
分析
斐波那契数 F(n) 定义:
F(0) = 0,
F(1) = 1,
F(n) = F(n-1) + F(n-2), (n > 1)
我们只需线性遍历到 n,即可用 O(n) 时间、O(1) 空间得到结果。
方法一:迭代 + 滚动变量
// C++ 实现
class Solution {
public:
int fib(int n) {
if (n < 2) return n;
int a = 0; // F(0)
int b = 1; // F(1)
int c;
for (int i = 2; i <= n; ++i) {
c = a + b; // F(i) = F(i-1) + F(i-2)
a = b; // 滚动:下轮当作 F(i-1)
b = c; // 下轮当作 F(i)
}
return b;
}
};
# Python 实现
class Solution:
def fib(self, n: int) -> int:
if n < 2:
return n
a, b = 0, 1 # 分别对应 F(0), F(1)
for _ in range(2, n + 1):
a, b = b, a + b
return b
- 时间复杂度:O(n)
- 空间复杂度:O(1)
方法二:递归 + 备忘录(不推荐 n 较大时使用)
// C++ 递归 + 备忘录
class Solution {
vector<int> memo;
public:
Solution(int n): memo(n+1, -1) {}
int fib(int n) {
if (n < 2) return n;
if (memo[n] != -1) return memo[n];
return memo[n] = fib(n-1) + fib(n-2);
}
};
# Python 递归 + 备忘录
class Solution:
def __init__(self):
self.memo = {0: 0, 1: 1}
def fib(self, n: int) -> int:
if n in self.memo:
return self.memo[n]
self.memo[n] = self.fib(n-1) + self.fib(n-2)
return self.memo[n]
- 时间复杂度:O(n)
- 空间复杂度:O(n)(递归栈 + 备忘录)
对于 0 ≤ n ≤ 30,方法一足够高效且实现简单。