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...