斐波那契數列log(n)時間複雜度解決方案---LeetCode70題代碼

代碼思路百度一大把,我主要是自己擼了遍,通過過了LeetCode測試。截圖如下:

vector<vector<int> > operator * (const vector<vector<int> >& a, const vector<vector<int> >& b) //矩陣乘法操作符重載
{
    
    int m = a.size(), n = a[0].size();
    int n2 = b.size(), l = b[0].size();
    if(n != n2)
    {
        vector<vector<int> > ans;
        return ans ;
    }
    vector<vector<int> > res(m,vector<int>(l,0));
    int i = 0, j = 0, k = 0;
    for (i = 0; i < m; ++i)
    {
       for(j = 0; j <n; ++j)
       {
           for(k = 0; k <l; ++k)
           {
               res[i][j] += a[i][k]*b[k][j];
           }
       }
    }
    return res;
    
}
class Solution {
public:
    int climbStairs(int n) 
    {
       int a = 1, b = 2;
       vector<vector<int> > G(2,vector<int>(2,1));
       G[0][0] = 0;

       if(n ==1)
       {
           return a;
       }
       if (n == 2)
       {
          return b;
       }
       
       
       vector<vector<int> > res = QuickPow(G,n-2); //注意此處n的變化
       b = res[1][0]*a + res[1][1] * b;
       return b;
    }

    vector<vector<int> > QuickPow(vector<vector<int> > &G, int n) //矩陣快速冪
    {
        if(n == 1 )
        {
            return G;
        }
        else
        {
            vector<vector<int> > res = QuickPow(G,n>>1);
            if(n&1)
            {
               
                return res * res * G;
            }
            else
            {
                return res* res;
            }
            
        }
        
    }
};

另外LeetCode有個bug:VSCode下安裝個LeetCode插件,可以不花錢就白嫖所有題目,題目能不能全部提交進行測試我還不清楚,我試了 下後面要花錢某一道的題目,是可以提交的。白嫖成功證明如下(我窮沒錢開LeetCode的會員):

 

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章