斐波那契数列的快速解法

来源:互联网 发布:知行理工密码 编辑:程序博客网 时间:2024/06/07 05:55

题目描述

求解斐波那契数列,要求时间复杂度为O(logn)

题目解答

主要思路是快速幂和矩阵乘法的结合律
这里写图片描述
利用数学归纳法来证明。
快速幂的思想:
当n为偶数的时候

an=an2an2

当n为奇数的时候
an=a(n1)2a(n1)2a

那么Fn的问题就可以换成求矩阵的n次幂了。

代码实现

class Solution {    /**     * @param n: an integer     * @return an integer f(n)     */    private static int[][] A = {{1,1},{1,0}};    public int fibonacci(int n) {        // write your code here        if(n < 1)            return 0;        int a = 0;        int b = 1;        if(n == 1)            return a;        if(n == 2)            return b;        int[][] ret= power(n-2);        return ret[0][0];    }    // 求 a ^ n     public static int[][] power(int n){        int[][] a = new int[2][2];        if(n == 1){            a = A;        }else if(n % 2 == 0){            a = matrixMultiply(power(n/2), power(n/2));        }else if(n % 2 == 1){            a = matrixMultiply(power(n/2), power(n/2));            a = matrixMultiply(a, A);        }        return a;    }    /*     *两个矩阵相乘    */    public static int[][] matrixMultiply(int[][] a, int[][] b){        int[][] ret = new int[2][2];        ret[0][0] = a[0][0]*b[0][0] + a[0][1]*b[1][0];        ret[0][1] = a[0][0]*b[0][1] + a[0][1]*b[1][1];        ret[1][0] = a[1][0]*b[0][0] + a[1][1]*b[1][0];        ret[1][1] = a[1][0]*b[0][1] + a[1][1]*b[1][1];        return ret;    }}
0 0
原创粉丝点击