题目
写一个函数,输入 n ,求斐波那契(Fibonacci)数列的第 n 项。斐波那契数列的定义如下:
F(0) = 0, F(1) = 1
F(N) = F(N - 1) + F(N - 2), 其中 N > 1.
斐波那契数列由 0 和 1 开始,之后的斐波那契数就是由之前的两数相加而得出。
答案需要取模 1e9+7(1000000007),如计算初始结果为:1000000008,请返回 1。
思路
在上一篇博客中,已经写了很多种关于这个斐波那契数列的解法了,这里就利用最高效的那种,就是,因为数值变大了,所以,需要将结果数组 变为long类型,等到最后再强转一下就好了!
代码
class Solution {
public int fib(int n) {
if (n<=1)
return n;
//基础矩阵
long base[][]={
{1,1},
{1,0}
};
//结果数组
long result[][]={
{1,1},
{0,0}
};
int test=n-2;//实际需要矩阵相乘的次数
while(test>0)
{
if((test&1)==1) multiply(result,base);//矩阵的 2的n次方是否需要进入到结果中
multiply(base,base);//计算矩阵的两次,四次,。。。。
test>>=1;
}
return (int)result[0][0]%1000000007;
}
//两个矩阵相乘
public void multiply(long[][] A, long[][] B) {
long x = ((A[0][0] * B[0][0])%1000000007 + (A[0][1] * B[1][0])%1000000007)%1000000007;
long y = ((A[0][0] * B[0][1])%1000000007 +(A[0][1] * B[1][1])%1000000007)%1000000007;
long z = ((A[1][0] * B[0][0])%1000000007+ (A[1][1] * B[1][0])%1000000007)%1000000007;
long w = ((A[1][0] * B[0][1])%1000000007 + (A[1][1] * B[1][1])%1000000007)%1000000007;
A[0][0] = x;
A[0][1] = y;
A[1][0] = z;
A[1][1] = w;
}
//把矩阵B赋值给矩阵A
public void voluation(long A[][],long B[][])
{
A[0][0]=B[0][0];
A[0][1]=B[0][1];
A[1][0]=B[1][0];
A[1][1]=B[1][1];
}
}
结果
就利用了一个矩阵快速幂来求解,因为有上一个题目的基础,这个不难!
斐波那契数列多种解法