斐波那契数列解法,矩阵解法,学习
来源:互联网 发布:c语言单片机培训班 编辑:程序博客网 时间:2024/06/10 06:04
链接:https://www.nowcoder.com/questionTerminal/c6c7742f5ba7442aada113136ddea0c3
来源:牛客网
/*
* O(logN)解法:由f(n) = f(n-1) + f(n-2),可以知道
* [f(n),f(n-1)] = [f(n-1),f(n-2)] * {[1,1],[1,0]}
* 所以最后化简为:[f(n),f(n-1)] = [1,1] * {[1,1],[1,0]}^(n-2)
* 所以这里的核心是:
* 1.矩阵的乘法
* 2.矩阵快速幂(因为如果不用快速幂的算法,时间复杂度也只能达到O(N))
*/
public class Solution {
public int Fibonacci(int n) {
if (n < 1) {
return 0;
}
if (n == 1 || n == 2) {
return 1;
}
//底
int[][] base = {{1,1},
{1,0}};
//求底为base矩阵的n-2次幂
int[][] res = matrixPower(base, n - 2);
//根据[f(n),f(n-1)] = [1,1] * {[1,1],[1,0]}^(n-2),f(n)就是
//1*res[0][0] + 1*res[1][0]
return res[0][0] + res[1][0];
}
//矩阵乘法
public int[][] multiMatrix(int[][] m1,int[][] m2) {
//参数判断什么的就不给了,如果矩阵是n*m和m*p,那结果是n*p
int[][] res = new int[m1.length][m2[0].length];
for (int i = 0; i < m1.length; i++) {
for (int j = 0; j < m2[0].length; j++) {
for (int k = 0; k < m2.length; k++) {
res[i][j] += m1[i][k] * m2[k][j];
}
}
}
return res;
}
/*
* 矩阵的快速幂:
* 1.假如不是矩阵,叫你求m^n,如何做到O(logn)?答案就是整数的快速幂:
* 假如不会溢出,如10^75,把75用用二进制表示:1001011,那么对应的就是:
* 10^75 = 10^64*10^8*10^2*10
* 2.把整数换成矩阵,是一样的
*/
public int[][] matrixPower(int[][] m, int p) {
int[][] res = new int[m.length][m[0].length];
//先把res设为单位矩阵
for (int i = 0; i < res.length; i++) {
res[i][i] = 1;
} //单位矩阵乘任意矩阵都为原来的矩阵
//用来保存每次的平方
int[][] tmp = m;
//p每循环一次右移一位
for ( ; p != 0; p >>= 1) {
//如果该位不为零,应该乘
if ((p&1) != 0) {
res = multiMatrix(res, tmp);
}
//每次保存一下平方的结果
tmp = multiMatrix(tmp, tmp);
}
return res;
}
}
- 斐波那契数列解法,矩阵解法,学习
- 斐波那契数列的矩阵解法(java实现)
- 斐波那契数列递归解法与循环解法
- 斐波那契数列的解法?
- 斐波那契数列解法
- 高效斐波那契数列解法
- 斐波那契数列解法
- 斐波那契数列实用解法
- 斐波那契数列的解法
- 029斐波那契数列的矩阵解法(keep it up)
- 斐波那契数列高效递归解法...
- 斐波那契数列的几种计算机解法
- 关于斐波那契数列的几种解法
- 斐波那契数列的几种不同解法
- 斐波那契数列的低效与高效解法
- 斐波那契数列的几种计算机解法
- 斐波那契数列的几种计算机解法
- 斐波那契数列的快速解法
- javascript 常用的编码格式:escape(), encodeURL(), encodeURIComponent()
- fgm实例练习笔记-3.7网页计算器
- js让表单只能输入数字
- 通过隐藏option实现select的联动效果
- MySQL sql优化建议
- 斐波那契数列解法,矩阵解法,学习
- codeforces 828 c String Reconstruction(扫描线+string)
- Ajax上传文件,获取返回值,拒绝页面刷新
- 5-1 厘米换算英尺英寸 (15分)
- 再说Web路径
- influxdb总结
- 在使用win 7 无线承载网络时,启动该服务时,有时会提示:组或资源的状态不是执行请求操作的正确状态。 网上有文章指出,解决这个问题的方法是在设备管理器中启动“Microsoft托管网络虚拟适配
- layui学习笔记
- MySQL Error Number 1005 Can’t create table