代码思路百度一大把,我主要是自己撸了遍,通过过了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的会员):