天天看點

斐波那契數列的快速解法題目描述題目解答

題目描述

求解斐波那契數列,要求時間複雜度為O( logn )

題目解答

主要思路是快速幂和矩陣乘法的結合律

斐波那契數列的快速解法題目描述題目解答

利用數學歸納法來證明。

快速幂的思想:

當n為偶數的時候

an=an2∗an2

當n為奇數的時候

an=a(n−1)2∗a(n−1)2∗a

那麼 Fn 的問題就可以換成求矩陣的n次幂了。

代碼實作

class Solution {
    /**
     * @param n: an integer
     * @return an integer f(n)
     */
    private static int[][] A = {{,},{,}};
    public int fibonacci(int n) {
        // write your code here
        if(n < )
            return ;
        int a = ;
        int b = ;
        if(n == )
            return a;
        if(n == )
            return b;
        int[][] ret= power(n-);
        return ret[][];
    }

    // 求 a ^ n 
    public static int[][] power(int n){

        int[][] a = new int[][];
        if(n == ){
            a = A;
        }else if(n %  == ){
            a = matrixMultiply(power(n/), power(n/));
        }else if(n %  == ){
            a = matrixMultiply(power(n/), power(n/));
            a = matrixMultiply(a, A);
        }

        return a;
    }


    /*
     *兩個矩陣相乘
    */
    public static int[][] matrixMultiply(int[][] a, int[][] b){
        int[][] ret = new int[][];
        ret[][] = a[][]*b[][] + a[][]*b[][];
        ret[][] = a[][]*b[][] + a[][]*b[][];
        ret[][] = a[][]*b[][] + a[][]*b[][];
        ret[][] = a[][]*b[][] + a[][]*b[][];
        return ret;
    }
}
           

繼續閱讀