劍指Offer10 I 斐波那契數列

2021-10-23 08:49:33 字數 1373 閱讀 6734

3.優化的動態規劃演算法

寫乙個函式,輸入n,求斐波那契(fibonacci)數列的第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

輸出:50

0 <= n <= 100

​ 絕大多數人學習遞迴法大概都是從斐波那契數列的例子開始的吧。求f(n)就是分別求f(n-1)f(n-2),然後遞迴執行下去。缺點就是有大量的重複計算

​ 解決重複計算的問題可以建立乙個陣列,用於儲存計算結果,這樣需要用到的時候就可以直接取用,不用再進行計算。很多動態規劃的題目都是這種建立陣列型別的。建立陣列需要o(n)的空間。動態規劃的幾個關鍵要素:

狀態定義:設陣列dp,其中dp[i]表示斐波那契數列的第i個數字

狀態轉移方程:dp[i] = dp[i-1] + dp[i-2]

初始狀態:dp[0] = 0, dp[1] = 1

c++**

class solution 

return dp[n];

}};

tips : 設正整數x, y, z ,有取餘公式:(x + y) % z = (x % z + y % z) % z

複雜度分析

時間複雜度:從dp[0]計算到dp[n],時間複雜度是o(n)

空間複雜度:需要乙個陣列,空間複雜度為o(n)

從狀態轉移方程*dp[i] = dp[i-1] + dp[i-2]*可以看到,需要求的一項只和前面兩項有關,所以可以只儲存前兩項,這樣就不用建立乙個o(n)的陣列了。

c++**

class solution 

return a;

}};

複雜度分析

時間複雜度:計算到f(n)需要迴圈n次,時間複雜度o(n)

空間複雜度:僅使用幾個變數,空間複雜度為o(1)

劍指 Offer 10 I 斐波那契數列

劍指 offer 10 i.斐波那契數列 寫乙個函式,輸入 n 求斐波那契 fibonacci 數列的第 n 項。斐波那契數列的定義如下 f 0 0,f 1 1 f n f n 1 f n 2 其中 n 1.斐波那契數列由 0 和 1 開始,之後的斐波那契數就是由之前的兩數相加而得出。答案需要取模 ...

劍指 Offer 10 I 斐波那契數列

題目描述 寫乙個函式,輸入 n 求斐波那契 fibonacci 數列的第 n 項。斐波那契數列的定義如下 f 0 0,f 1 1,f n f n 1 f n 2 其中 n 1.斐波那契數列由 0 和 1 開始,之後的斐波那契數就是由之前的兩數相加而得出。答案需要取模 1e9 7 1000000007...

劍指 Offer 10 I 斐波那契數列

題目鏈結 題目描述 1.寫乙個函式,輸入 n 求斐波那契 fibonacci 數列的第 n 項。斐波那契數列的定義如下 f 0 0,f 1 1 f n f n 1 f n 2 其中 n 1.斐波那契數列由 0 和 1 開始,之後的斐波那契數就是由之前的兩數相加而得出。答案需要取模 1e9 7 100...