題目描述:寫乙個函式,輸入 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
輸出:5
解題思路:很容易可以想到遞迴的實現思路,但是使用遞迴的解法存在很多重複的計算,比如計算
f(4)=f(3)+f(2)
的時候,計算過程中f(2)
重複計算了兩次,因為f(3)=f(2)+f(1)
。遞迴是將乙個問題劃分成多個子問題求解,動態規劃也是如此,但是動態規劃會把子問題的解快取起來,從而避免重複求解子問題,因此這道題可以使用乙個int
陣列int f
,在計算過程中不斷儲存之前的計算好的結果。這種解法的時間複雜度是o(n)
,空間複雜度也是o(n)
。
由於只需要得到f[n]的結果,而f[n]=f[n-1]+f[n-2]
,也就是在計算f[n]
的時候只需要知道f[n-1]
和f[n-2]
,因此不需要開闢乙個int陣列來儲存所有的計算結果,只需要兩個臨時變數pre1
和pre2
來儲存計算f[n]
時所需要的f[n-2]
和f[n-1]
即可,這樣空間複雜度可以降為o(1)
。
實現**:
public
intfib
(int n);if
(n <2)
return res[n]
;int pre1 =0;
int pre2 =1;
int num =0;
for(
int i =
2; i <= n; i++
)return num;
}public
intfib1
(int n)
return num[n]
;}
劍指 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 斐波那契數列
題目鏈結 題目描述 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...
劍指 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 如計算初...