劍指offer10動態規劃 斐波那契數列

2021-10-10 08:21:50 字數 1504 閱讀 4891

題目:

寫乙個函式,輸入 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。

答案需要取模 1e9+7(1000000007),如計算初始結果為:1000000008,請返回 1。

分析:f(n) = f(n - 1) + f(n - 2),動態規劃,dp備忘錄。

思路:1、 遞迴,不建議,複雜度取決於fib呼叫次數,複雜度為o(2^n)

public

intfib

(int n)

return

fib(n -1)

+fib

(n -2)

;}

2、 迭代,自底向上

**實現:

時間複雜度o(n),空間複雜度o(1)

①斐波那契數列

class

solution

if(n ==1)

int fibn_2 =0;

int fibn_1 =1;

int fibn =1;

// 對於數列中的的第n項,需要經過 n-1 次相加才得到,所以需要迴圈n-1次,即i取[0,n-1)

for(

int i =

0; i < n-

1; i++

)return fibn;

}}

②常規青蛙跳

class

solution

else

if(n ==1)

else

return numwaysi;}}

}

這裡要特別說明下,上面取餘的過程,題目要求最終結果取餘,本塊**給人的感覺是,整個迭代的過程使用的是取餘後的結果進行運算,似乎與題意不符。

這題主要考慮大數越界問題: 隨著 n 增大, f(n) 會超過 int32 甚至 int64 的取值範圍,導致最終的返回值錯誤。因此如果在算出結果後才取餘可能並不正確,因為算出來的結果在沒取余時已經越界了,結果已經時錯誤的。

即全程使用取餘後的數字進行計算,每次得到的值就是取餘後結果,這和原始的每一步按f(n) = f(n - 1) + f(n - 2)計算後再取餘結果是等價的。

超級青蛙跳:

**實現

時間複雜度o(n),空間複雜度o(1)

public

class

solution

else

if(target ==2)

else

return jumpsi;}}

}

推薦閱讀:動態規劃套路詳解

劍指offer 10 斐波那契數列

遞迴解法 long fibonacci int n 在劍指offer中提到,面試時如果僅僅是做出遞迴的解法,估計是通過不了面試的。我們分析遞迴的過程,以求f 10 為例,需先求f 9 和f 8 要求f 9 需先求f 8 和f 7 我們可以發現在求解的過程中有很多節點是重複計算的,而且計算量是指數遞增...

劍指Offer10 斐波那契數列

class solution return b 2.最優解 矩陣運算 快速冪 o logn 每次n右移一位,即每次迴圈除2,直至n為0,因此時間為log2 n,o 1 需要兩個矩陣大小 快速冪 a n xi 1 a logn x3 a 4 x2 a 2 x1 a 1 x0 a 0 其中x序列是指數n...

劍指offer 10 斐波那契數列

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