1. 程式人生 > 其它 >每日一練(5):斐波那契數列

每日一練(5):斐波那契數列


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;
}