剑指 Offer 10- I. 斐波那契数列

剑指 Offer 10- I. 斐波那契数列

递归

时间复杂度指数级,很多值重复计算

动态规划

每一项只计算一次,时间复杂度O(n)

class Solution {
public:
    int fib(int n) {
        int MOD=1000000007;
        if(n<2)
        {
            return n;
        }
        int a=0,b=1,tmp=0;
        for(int i=2;i<=n;i++)
        {
            tmp=b;
            b=(a+b)%1000000007;
            a=tmp;
        }
        return b;
    }
};

 

 

矩阵快速幂

斐波那契数列数列,可以认为是

image-20211028095059145

image-20211028095110726

转化为一个矩阵的n次方和一个矩阵的乘积,优化的地方在于求n次方,我们可以使用快速幂,当然矩阵的快速幂比实数的快速幂复杂一点。

class Solution {
public:
    const int MOD = 1000000007;
    int fib(int n) {
       if(n<2)
       {
           return n;
       }
       vector<vector<long>> q = {{1,1},{1,0}};
       vector<vector<long>> ans = pow(q,n-1);
       return ans[0][0];
    }
​
    vector<vector<long>> pow(vector<vector<long>>& a,int n)
    {
        vector<vector<long>> ret ={{1,0},{0,1}};
        while(n > 0)
        {
            if(n & 1)
            {
                ret = multiply(ret,a);
            }
            n >>= 1;
            a = multiply(a,a);
        }
        return ret;
    }
​
    vector<vector<long>> multiply(vector<vector<long>>& a ,vector<vector<long>>& b)
    {
        vector<vector<long>> c = {{0,0},{0,0}};
        for(int i=0;i<2;i++)
        {
            for(int j=0;j<2;j++)
            {
                c[i][j]=(a[i][0]*b[0][j]+a[i][1]*b[1][j])%MOD;
            }
        }
        return c;
    }
};

 

 

 

posted @ 2021-10-28 10:20  渴望成为大佬的菜鸡  阅读(27)  评论(0)    收藏  举报