題目描述
求解斐波那契數列,要求時間複雜度為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;
}
}