题目描述:
大家都知道斐波那契数列,现在要求输入一个整数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)时间复杂度
(切记不能用递归,不然会导致栈溢出)

实现:

迭代:

java
  • 01
  • 02
  • 03
  • 04
  • 05
  • 06
  • 07
  • 08
  • 09
  • 10
  • 11
  • 12
  • 13
  • 14
  • 15
  • 16
  • 17
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; } } }

矩阵相乘:

java
  • 01
  • 02
  • 03
  • 04
  • 05
  • 06
  • 07
  • 08
  • 09
  • 10
  • 11
  • 12
  • 13
  • 14
  • 15
  • 16
  • 17
  • 18
  • 19
  • 20
  • 21
  • 22
  • 23
  • 24
  • 25
  • 26
  • 27
  • 28
  • 29
  • 30
  • 31
  • 32
  • 33
  • 34
  • 35
  • 36
  • 37
  • 38
  • 39
  • 40
  • 41
  • 42
  • 43
  • 44
  • 45
  • 46
  • 47
  • 48
  • 49
  • 50
  • 51
  • 52
链接: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; } };