劍指offer:斐波那契數列
阿新 • • 發佈:2019-03-30
表示 n-1 strong 遞歸調用 http 開始 rac urn 斐波那契
目錄
- 題目
- 解題思路
- 具體代碼
題目
題目鏈接
劍指offer:斐波那契數列
題目描述
大家都知道斐波那契數列,現在要求輸入一個整數n,請你輸出斐波那契數列的第n項(從0開始,第0項為0)。
n<=39
解題思路
斐波那契數列屬於經典的遞歸問題,對於這題的求解,我們首先要知道斐波那契數列的狀態轉移式,即f[n]=f[n-1]+f[n-2]
,且在n=1或2時,f[n]=1。
在理解基礎的狀態轉移式後,最容易想到的便是遞歸調用,但很遺憾,這樣算法的時間復雜度往往達不到要求。
仔細觀察後可以發現,每次求解的f[n]都在之後兩個f[n]的求解中起作用,因此我們可以將其保存,這樣能夠避免重復計算,降低算法的時間復雜度;同時,因為只在後續兩個f[n]的求解中起作用,因此只需要保存兩個f[n]的值即可。
具體代碼
class Solution { public: int Fibonacci(int n) { int num[3]; // num[0]和num[1]分別表示f[n-2]和f[n-1] num[0] = 0; num[1] = 1; if (n < 2) return num[n]; // 計算n>2時數列的值 for (int i = 2; i <=n; i++) { num[2] = num[0] + num[1]; // 更新f[n-2]和f[n-1] num[0] = num[1]; num[1] = num[2]; } return num[2]; } };
劍指offer:斐波那契數列