斐波那契数列的快速解法
2015-12-06 20:15
387 查看
题目描述
求解斐波那契数列,要求时间复杂度为O(logn\log n )题目解答
主要思路是快速幂和矩阵乘法的结合律利用数学归纳法来证明。
快速幂的思想:
当n为偶数的时候
an=an2∗an2a^n = a^{n \over 2} * a^{n \over 2}
当n为奇数的时候
an=a(n−1)2∗a(n−1)2∗aa^n = a^{(n-1) \over 2} * a^{(n-1) \over 2} * a
那么FnF_n的问题就可以换成求矩阵的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; } }
相关文章推荐
- 初识设计模式
- 7、数据库的并发
- 垂直居中显示的几个方法
- 快学scala习题(七)-----包
- 转载:Objective-C中的 instancetype 和 id 关键字
- 数字划分类 dp
- Putty远程SSH免密码方式链接Linxu
- day_34Java多线程
- 6、抓取策略
- 高精度计算练习1
- mongodb的CursorNotFound异常
- LeetCode 007 Reverse Integer
- 5、缓存
- C开发 中原子性操作 , 除了快什么都不剩下了
- 信息安全系统设计基础第十三周学习总结
- Struts2框架学习(一)
- Android -- List View
- 4、HQL
- String类型(字符串类型)
- 配置mysql5.5主从服务器(转)