每日一練(5):斐波那契數列
阿新 • • 發佈:2022-01-18
title: 每日一練(5):斐波那契數列
categories:[劍指offer]
tags:[每日一練]
date: 2022/01/18
每日一練(5):斐波那契數列
寫一個函式,輸入 n ,求斐波那契(Fibonacci)數列的第 n 項(即 F(N))。斐波那契數列的定義如下:
F(0) = 0, F(1) = 1
F(N) = F(N - 1) + F(N - 2), 其中 N > 1.
斐波那契數列由 0 和 1 開始,之後的斐波那契數就是由之前的兩數相加而得出。
答案需要取模 1e9+7(1000000007),如計算初始結果為:1000000008,請返回 1。
示例 1:
輸入:n = 2
輸出:1
示例 2:
輸入:n = 5
輸出:5
提示:
0 <= n <= 100
來源:力扣(LeetCode)
連結:https://leetcode-cn.com/problems/fei-bo-na-qi-shu-lie-lcof
方法一:動態規劃
演算法流程:
斐波那契數的邊界條件是 F(0) = 0 和 F(1) = 1。當 n > 1 時,每一項的和都等於前兩項的和,因此有如下遞推關係:
F(n) = F(n - 1) + F(n - 2)
由於斐波那契數存在遞推關係,因此可以使用動態規劃求解。動態規劃的狀態轉移方程即為上述遞推關係,邊界條件為 F(0) 和 F(1)。
複雜度分析
- 時間複雜度:O(n)
- 空間複雜度:O(1)
int fib(int n) {
int MOD = 1000000007;
if (n < 2) {
return n;
}
int p = 0, q = 0, r = 1;
for (int i = 2; i <= n; ++i) {
p = q;
q = r;
r = (p + q)%MOD;
}
return r;
}
方法二:滑動視窗
public int fib(int n) { int MOD = 1000000007; int a = 0, b = 1; while (n > 0){ b = a+b; a = b-a; --n; b %= MOD; } return a; }