剑指Offer #07 斐波那契数列(四种解法)| 图文详解
題目來源:??途W-劍指Offer專題
題目地址:斐波那契數列
題目描述
大家都知道斐波那契數列,現在要求輸入一個整數n,請你輸出斐波那契數列的第n項(從0開始,第0項為0)。n<=39
題目解析
方法一:
普通遞歸版求法,這種方法通常和漢諾塔一起被放在課本的遞歸教學部分,應該是面試官不希望看到的算法。
F(n)={0,n=01,n=1,2F(n?1)+F(n?2),n>2F(n) = \begin{cases} 0, & \text {n=0} \\ 1, & \text {n=1,2} \\ F(n-1)+F(n-2), & \text{n>2} \end{cases} F(n)=??????0,1,F(n?1)+F(n?2),?n=0n=1,2n>2?
利用上面遞推式,自頂向下進行求解,因為存在大量的重疊子問題,時間復雜度為 O(2n)O(2^n)O(2n)。
方法二:
我們可以將遞推式的求解從自頂向下改為自底向上(循環實現)。簡而言之,我們已知前兩項的值,然后我們就可以用前兩項的值求出第3項的值,接著求第4、第5、……,直到求出第n項的值。(廢話)
實現過程如下圖所示,兩個相同顏色的箭頭可以確定一個新的數列項。
上述算法的時間復雜度為 O(n)O(n)O(n),在面試中夠用了,如果還是覺得簡單可以繼續往下看。
方法三:
我們知道:
F(n)=F(n?1)+F(n?2)F(n?1)=F(n?1)+0?F(n?2)F(n)=F(n-1)+F(n-2) \\ F(n-1)=F(n-1)+0*F(n-2) F(n)=F(n?1)+F(n?2)F(n?1)=F(n?1)+0?F(n?2)
將其轉化成矩陣運算可得
(F(n)F(n?1))=(1110)?(F(n?1)F(n?2))\begin{pmatrix} F(n) \\ F (n-1)\\ \end{pmatrix}= \begin{pmatrix} 1&1 \\ 1&0 \\ \end{pmatrix}* \begin{pmatrix} F(n-1) \\F(n-2)\\ \end{pmatrix} (F(n)F(n?1)?)=(11?10?)?(F(n?1)F(n?2)?)
而右邊的2×12\times12×1階矩陣又可以進一步分解為
(F(n?1)F(n?2))=(1110)?(1110)?(F(n?2)F(n?3))\begin{pmatrix} F(n-1) \\ F (n-2)\\ \end{pmatrix}= \begin{pmatrix} 1&1 \\ 1&0 \\ \end{pmatrix}* \begin{pmatrix} 1&1 \\ 1&0 \\ \end{pmatrix}* \begin{pmatrix} F(n-2) \\F(n-3)\\ \end{pmatrix} (F(n?1)F(n?2)?)=(11?10?)?(11?10?)?(F(n?2)F(n?3)?)
按照這樣一直分解下去直到右邊的2×12\times12×1階矩陣F(2),F(1),即
(F(n)F(n?1))=(1110)n?2?(F(2)F(1))\begin{pmatrix} F(n) \\ F (n-1)\\ \end{pmatrix}= \begin{pmatrix} 1&1 \\ 1&0 \\ \end{pmatrix}^{n-2}* \begin{pmatrix} F(2) \\F(1)\\ \end{pmatrix} (F(n)F(n?1)?)=(11?10?)n?2?(F(2)F(1)?)
這時利用矩陣版的快速冪求解其中的矩陣冪乘,就可以在 O(logn)O(logn)O(logn) 的時間復雜度下得出Fibonacci數列的第n項的值。
這種方法通常是用在算法比賽中,在面試中容易裝逼失敗不適合使用,這里也不掛板子了。
方法四:
根據上面的遞推式,利用我們高中學過的“待定系數法”可以推導出斐波那契數列的通項公式。公式如下,(推導過程略)
F(n)=55[(1+52)n?(1?52)n]F(n)=\frac {\sqrt5} {5} [(\frac {1+\sqrt5} {2})^n-(\frac {1-\sqrt5} {2})^n] F(n)=55??[(21+5??)n?(21?5??)n]
公式法時間復雜度為 O(1)O(1)O(1) ? 感覺不然,求公式中的 nnn 次方應該要用上快速冪,我個人認為時間復雜度應該也是 O(logn)O(logn)O(logn)。(我要滾去看源碼了 )
后記:
如果你在寫出循環版之后,再給面試官描述后面兩種算法,并流暢寫出通項公式的推導過程,相信肯定可以取得面試官的芳心~
如果本文對你有所幫助,要記得點贊哦~
總結
以上是生活随笔為你收集整理的剑指Offer #07 斐波那契数列(四种解法)| 图文详解的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 剑指Offer #06 旋转数组的最小数
- 下一篇: CentOS7安装wdCP面板,快速搭建