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,方法一足夠高效且實現簡單。