1. 程式人生 > >劍指offer:斐波那契數列

劍指offer:斐波那契數列

表示 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:斐波那契數列