劍指offer第二版-10.斐波那契數(shù)列

本系列導航:劍指offer(第二版)java實現(xiàn)導航帖

面試題10:斐波那契數(shù)列

題目要求:
求斐波那契數(shù)列的第n項的值梧兼。f(0)=0, f(1)=1, f(n)=f(n-1)+f(n-2) n>1

解法比較:
解法3,4將問題數(shù)學化我碟,借助數(shù)學工具的推導饵较,從根本上減低時間復雜度。

解法 解法介紹 時間復雜度 空間復雜度
解法1 依定義遞歸求解 o(n^2) o(1)
解法2 從0開始迭代求解 o(n) o(1)
解法3 借助等比數(shù)列公式 o(logn) o(1)
解法4 借助通項公式 o(1) o(1)

代碼:

package chapter2;

/**
 * Created by ryder on 2017/6/21.
 * 斐波那契數(shù)列
 * f(0)=0,f(1)=1,f(n)=f(n-1)+f(n-2) n>1
 */
public class P74_Fibonacci {

    // 依據(jù)原始概念的遞歸解法筒占,時間復雜度o(n^2)
    public static int fibonacci1(int n){
        if(n<=0)
            return 0;
        if(n==1)
            return 1;
        return fibonacci1(n-1)+fibonacci1(n-2);
    }

    // 當前狀態(tài)只與前兩個狀態(tài)有關(guān)卓缰。存儲前兩個值牡昆,計算后一個,迭代進行掂器。時間復雜度o(n)
    public static int fibonacci2(int n){
        if(n<=0)
            return 0;
        if(n==1)
            return 1;
        int temp1 =0,temp2=1;
        int result = temp1 + temp2,i=3;
        while(i<=n){
            //也可用一個隊列來完成下面三行的操作
            temp1 = temp2;
            temp2 = result;
            result = temp1+temp2;
            i++;
        }
        return result;
    }

    // 借助如下數(shù)學公式解決問題亚皂。矩陣乘法部分,可用遞歸解決国瓮,時間復雜度o(logn)
    // [ f(n)  f(n-1) ] = [ 1  1 ] ^ n-1   (當n>2)
    // [f(n-1) f(n-2) ]   [ 1  0 ]
    // 證明:
    // [ f(n)  f(n-1) ] = [ f(n-1)+f(n-2)  f(n-1)] = [ f(n-1)  f(n-2)] * [1 1]
    // [f(n-1) f(n-2) ]   [ f(n-2)+f(n-3)  f(n-2)]   [ f(n-2)  f(n-3)]   [1 0]
    // 得到如上遞推式灭必,所以
    // [ f(n)  f(n-1) ] = [ f(2)  f(1)] * [1 1]^n-2 = [1 1]^n-1
    // [f(n-1) f(n-2) ]   [ f(1)  f(0)]   [1 0]       [1 0]
    public static int fibonacci3(int n){
        int[][] start = {{1,1},{1,0}};
        return matrixPow(start,n-1)[0][0];
    }
    public static int[][] matrixPow(int[][] start,int n){
         if((n&1)==0){
             int[][] temp = matrixPow(start,n>>1);
             return matrixMultiply(temp,temp);
         }
         else if(n==1){
             return start;
         }
         else{
             return matrixMultiply(start,matrixPow(start,n-1));
         }
    }
    public static int[][] matrixMultiply(int[][] x,int[][] y){
        int[][] result = new int[x.length][y[0].length];
        for(int i=0;i<x.length;i++){
            for(int j=0;j<y[0].length;j++){
                int sum = 0;
                for(int k=0;k<x[0].length;k++){
                    sum += x[i][k]*y[k][j];
                }
                result[i][j] = sum;
            }
        }
        return result;
    }

    // 使用通項公式完成,時間復雜度o(1)
    // f(n) = (1/√5)*{[(1+√5)/2]^n - [(1-√5)/2]^n}
    // 推導過程可參考https://wenku.baidu.com/view/57333fe36bd97f192379e936.html
    public static int fibonacci4(int n){
        double gen5 = Math.sqrt(5);
        return (int)((1/gen5)*(Math.pow((1+gen5)/2,n)- Math.pow((1-gen5)/2,n)));
    }

    public static void main(String[] args){
        System.out.println(fibonacci1(13));
        System.out.println(fibonacci2(13));
        System.out.println(fibonacci3(13));
        System.out.println(fibonacci4(13));
    }
}

運行結(jié)果

233
233
233
233
最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
  • 序言:七十年代末乃摹,一起剝皮案震驚了整個濱河市禁漓,隨后出現(xiàn)的幾起案子,更是在濱河造成了極大的恐慌孵睬,老刑警劉巖播歼,帶你破解...
    沈念sama閱讀 212,599評論 6 492
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件,死亡現(xiàn)場離奇詭異掰读,居然都是意外死亡秘狞,警方通過查閱死者的電腦和手機,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 90,629評論 3 385
  • 文/潘曉璐 我一進店門蹈集,熙熙樓的掌柜王于貴愁眉苦臉地迎上來谒撼,“玉大人,你說我怎么就攤上這事雾狈±保” “怎么了?”我有些...
    開封第一講書人閱讀 158,084評論 0 348
  • 文/不壞的土叔 我叫張陵善榛,是天一觀的道長辩蛋。 經(jīng)常有香客問我,道長移盆,這世上最難降的妖魔是什么悼院? 我笑而不...
    開封第一講書人閱讀 56,708評論 1 284
  • 正文 為了忘掉前任,我火速辦了婚禮咒循,結(jié)果婚禮上据途,老公的妹妹穿的比我還像新娘绞愚。我一直安慰自己,他們只是感情好颖医,可當我...
    茶點故事閱讀 65,813評論 6 386
  • 文/花漫 我一把揭開白布位衩。 她就那樣靜靜地躺著,像睡著了一般熔萧。 火紅的嫁衣襯著肌膚如雪糖驴。 梳的紋絲不亂的頭發(fā)上,一...
    開封第一講書人閱讀 50,021評論 1 291
  • 那天佛致,我揣著相機與錄音贮缕,去河邊找鬼。 笑死俺榆,一個胖子當著我的面吹牛感昼,可吹牛的內(nèi)容都是我干的。 我是一名探鬼主播罐脊,決...
    沈念sama閱讀 39,120評論 3 410
  • 文/蒼蘭香墨 我猛地睜開眼抑诸,長吁一口氣:“原來是場噩夢啊……” “哼!你這毒婦竟也來了爹殊?” 一聲冷哼從身側(cè)響起蜕乡,我...
    開封第一講書人閱讀 37,866評論 0 268
  • 序言:老撾萬榮一對情侶失蹤,失蹤者是張志新(化名)和其女友劉穎梗夸,沒想到半個月后层玲,有當?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體,經(jīng)...
    沈念sama閱讀 44,308評論 1 303
  • 正文 獨居荒郊野嶺守林人離奇死亡反症,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點故事閱讀 36,633評論 2 327
  • 正文 我和宋清朗相戀三年辛块,在試婚紗的時候發(fā)現(xiàn)自己被綠了。 大學時的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片铅碍。...
    茶點故事閱讀 38,768評論 1 341
  • 序言:一個原本活蹦亂跳的男人離奇死亡润绵,死狀恐怖,靈堂內(nèi)的尸體忽然破棺而出胞谈,到底是詐尸還是另有隱情尘盼,我是刑警寧澤,帶...
    沈念sama閱讀 34,461評論 4 333
  • 正文 年R本政府宣布烦绳,位于F島的核電站卿捎,受9級特大地震影響,放射性物質(zhì)發(fā)生泄漏径密。R本人自食惡果不足惜午阵,卻給世界環(huán)境...
    茶點故事閱讀 40,094評論 3 317
  • 文/蒙蒙 一、第九天 我趴在偏房一處隱蔽的房頂上張望享扔。 院中可真熱鬧底桂,春花似錦植袍、人聲如沸。這莊子的主人今日做“春日...
    開封第一講書人閱讀 30,850評論 0 21
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽。三九已至猫十,卻和暖如春,著一層夾襖步出監(jiān)牢的瞬間呆盖,已是汗流浹背拖云。 一陣腳步聲響...
    開封第一講書人閱讀 32,082評論 1 267
  • 我被黑心中介騙來泰國打工, 沒想到剛下飛機就差點兒被人妖公主榨干…… 1. 我叫王不留应又,地道東北人宙项。 一個月前我還...
    沈念sama閱讀 46,571評論 2 362
  • 正文 我出身青樓,卻偏偏與公主長得像株扛,于是被迫代替她去往敵國和親尤筐。 傳聞我的和親對象是個殘疾皇子,可洞房花燭夜當晚...
    茶點故事閱讀 43,666評論 2 350

推薦閱讀更多精彩內(nèi)容