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 na, b = 0, 1 # 分别对应 F(0), F(1)for _ in range(2, n + 1):a, b = b, a + breturn 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,方法一足够高效且实现简单。