题目描述:
大家都知道斐波那契数列,现在要求输入一个整数n,请你输出斐波那契数列的第n项(从0开始,第0项为0)。
n<=39
思路:
F(0)=0
F(1)=1
F(2)=1
F(n)=F(n-1)+F(n-2)(n>=3,n∈N*)
即记录前面计算的n-1和n-2的值
1.迭代:O(n)时间复杂度;
2.矩阵相乘:O(logn)时间复杂度
(切记不能用递归,不然会导致栈溢出)
实现:
迭代:
public class Solution {
public int Fibonacci(int n) {
int a=1,b=1,f=0;
if(n<0){
return 0;
}else if(n==1||n==2){
return 1;
}else{
for (int i=3;i<=n;i++){
f=a+b;
b=a;
a=f;
}
return f;
}
}
}
矩阵相乘:
链接:https://www.nowcoder.com/questionTerminal/c6c7742f5ba7442aada113136ddea0c3
来源:牛客网
class Solution {
public:
int Fibonacci(int n) {
if(n<1) return 0;
if(n==1||n==2) return 1;
vector<vector<int> > base = {{1,1},{1,0}};
vector<vector<int> > res=matrixPower(base, n-2);
return res[0][0]+res[1][0];
}
//矩阵相乘
vector<vector<int> > matrix_multiply(vector<vector<int> > arrA, vector<vector<int> > arrB)
{
int rowA=arrA.size();
int colA=arrA[0].size();
int colB=arrA[0].size();
int rowB=arrA.size();
vector<vector<int> > res (rowA,vector<int> (colB,0));
if(colA!=rowB) return res;
for(int i=0;i<rowA;i++)
{
for(int j=0;j<colB;j++)
{
for(int m=0;m<colA;m++)
res[i][j]+=arrA[i][m]*arrB[m][j];
}
}
return res;
}
vector<vector<int> > matrixPower(vector<vector<int> > a,int p)
{
vector<vector<int> > res (a.size(),vector<int> (a[0].size(),0));
for(int i=0;i<res.size();i++)
{
res[i][i]=1;
}
vector<vector<int> > tmp(a);
for(;p!=0;p>>=1)
{
if((p&1)!=0)
{
res=matrix_multiply(res,tmp);
}
tmp=matrix_multiply(tmp,tmp);
}
return res;
}
};