斐波那契数列
问题
- 给定整数
N
,一次可以跨1
个台阶或者2
个台阶,请问一共有多少种走法(要求使用对数级别的时间复杂度)
解答
- 常规思路(
F(n) = F(n-1)+F(n-2)
) - 增加一个数组进行存储,动态规划,可以完成
O(n)
的时间复杂度 - 矩阵计算:就像对 a 的 b 次方的对数级方案
- 对于为什么
2*result[0][0]+result[1][0]
,可以进一步考虑N = 3
的场景 base
数组根据前 4 个值即可算法
- 对于为什么
import java.util.*;
public class Main {
public static void main(String[] args) {
Scanner scanner = new Scanner(System.in);
String mn = scanner.nextLine();
Integer N = Integer.valueOf(mn);
int[][] base = {{1,1},{1,0}};
int[][] result = matrixPower(base,N-2);
System.out.println(2*result[0][0]+result[1][0]);
System.out.println(checkResult(N));
}
private static int checkResult(Integer n) {
if (n == 1 || n == 2){
return n;
}
if (n <= 0) return 0;
return checkResult(n-1) + checkResult(n-2);
}
public static int[][] matrixPower(int [][] m, int p){
int[][] res = new int[m.length][m[0].length];
for (int i = 0;i < res.length;i ++) {
res[i][i] = 1;
}
int[][] temp = m;
for (;p != 0;p >>= 1){
if ((p & 1) != 0){
res = matrixPower(res,temp);
}
temp = matrixPower(temp,temp);
}
return res;
}
public static int[][] matrixPower(int [][] m1, int[][] m2) {
int [][] res = new int[m1.length][m2[0].length];
for (int i = 0; i < m2[0].length; i ++){
for (int j = 0; j < m1.length; j ++){
for (int k = 0; k < m2.length; k ++){
res[i][j] += m1[i][k] * m2[k][j];
}
}
}
return res;
}
}
如果你对这篇内容有疑问,欢迎到本站社区发帖提问 参与讨论,获取更多帮助,或者扫码二维码加入 Web 技术交流群。
上一篇: 设计模式 单例模式
绑定邮箱获取回复消息
由于您还没有绑定你的真实邮箱,如果其他用户或者作者回复了您的评论,将不能在第一时间通知您!
发布评论