飞道的博客

leetcode509. 斐波那契数(矩阵快速幂)

361人阅读  评论(0)

斐波那契数,通常用 F(n) 表示,形成的序列称为斐波那契数列。该数列由 0 和 1 开始,后面的每一项数字都是前面两项数字的和。也就是:

F(0) = 0,   F(1) = 1
F(N) = F(N - 1) + F(N - 2), 其中 N > 1.
给定 N,计算 F(N)。

示例 1:

输入:2
输出:1
解释:F(2) = F(1) + F(0) = 1 + 0 = 1.
示例 2:

输入:3
输出:2
解释:F(3) = F(2) + F(1) = 1 + 1 = 2.
示例 3:

输入:4
输出:3
解释:F(4) = F(3) + F(2) = 2 + 1 = 3.

矩阵快速幂


  
  1. class Solution {
  2. int fib(int N) {
  3. if (N <= 1) {
  4. return N;
  5. }
  6. int[][] A = new int[][]{{ 1, 1}, { 1, 0}};
  7. matrixPower(A, N- 1);
  8. return A[ 0][ 0];
  9. }
  10. void matrixPower(int[][] A, int N) {
  11. if (N <= 1) {
  12. return;
  13. }
  14. matrixPower(A, N/ 2);
  15. multiply(A, A);
  16. int[][] B = new int[][]{{ 1, 1}, { 1, 0}};
  17. if (N% 2 != 0) {
  18. multiply(A, B);
  19. }
  20. }
  21. void multiply(int[][] A, int[][] B) {
  22. int x = A[ 0][ 0] * B[ 0][ 0] + A[ 0][ 1] * B[ 1][ 0];
  23. int y = A[ 0][ 0] * B[ 0][ 1] + A[ 0][ 1] * B[ 1][ 1];
  24. int z = A[ 1][ 0] * B[ 0][ 0] + A[ 1][ 1] * B[ 1][ 0];
  25. int w = A[ 1][ 0] * B[ 0][ 1] + A[ 1][ 1] * B[ 1][ 1];
  26. A[ 0][ 0] = x;
  27. A[ 0][ 1] = y;
  28. A[ 1][ 0] = z;
  29. A[ 1][ 1] = w;
  30. }
  31. }

 


转载:https://blog.csdn.net/hebtu666/article/details/105827421
查看评论
* 以上用户言论只代表其个人观点,不代表本网站的观点或立场