【算法】509. 斐波那契数

发布于:2025-07-01 ⋅ 阅读:(21) ⋅ 点赞:(0)

在这里插入图片描述

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,方法一足够高效且实现简单。

在这里插入图片描述