描述
给定两个nxn的矩阵A和B,求AxB。
示例

输入:
[[1,2],[3,2]],[[3,4],[2,1]]
返回值:
[[7,6],[13,14]]

方法一:数学模拟
有两个矩阵:a和b(矩阵实际上就是二维数组)

a矩阵和b矩阵可以做乘法运算必须满足a矩阵的列的数量等于b矩阵的行的数量

运算规则:a的每一行中的数字对应乘以b的每一列的数字把结果相加起来

图片说明

相乘后的矩阵c行数量等于a矩阵的行数,列数等于b矩阵的列数,因为每次循环都是a的行与b的列,所以最外面两层循环分别是a的行的变化和b的列的变化,而最里面的循环可以是a的列或者是b的行来进行变化,因为a的列和是b的行数量是相等的,这样就可以使用三层循环来解决.

图片说明
代码如下:

class Solution {
public:
    /**
     * 代码中的类名、方法名、参数名已经指定,请勿修改,直接返回方法规定的值即可
     * 
     * @param a int整型vector<vector<>> 第一个矩阵
     * @param b int整型vector<vector<>> 第二个矩阵
     * @return int整型vector<vector<>>
     */
    vector<vector<int> > solve(vector<vector<int> >& a, vector<vector<int> >& b) {
        //a,b数组的行数和列数相等
        int n=a.size();
        vector<vector<int>>c(n,vector<int>(n,0));
        for(int i=0;i<n;i++){
            for(int j=0;j<n;j++){
                for(int k=0;k<n;k++){
                    c[i][j]+=a[i][k]*b[k][j];
                }
            }
        }return c;
    }
};

复杂度:

  • 时间复杂度:有三层循环,图片说明
  • 空间复杂度:辅助空间为相乘后的矩阵c大小为图片说明 ,所以空间复杂度为图片说明

方法二:利用二维数组在CPU连续存储优化
显然,方法一中计算时遍历完数组第一行和数组第一列后,计算时会从回退到继续用第一行元素计算,比较费时间,可以利用cpu在遍历二维矩阵是一行一行遍历的特性,先存储,将所有需要用到的地方优先计算上,这样遍历数组时就是遵循数组在内存中的存储顺序进行遍历,节省时间,例如先访问,计算出,然后访问,计算出

class Solution {
public:
    /**
     * 代码中的类名、方法名、参数名已经指定,请勿修改,直接返回方法规定的值即可
     * 
     * @param a int整型vector<vector<>> 第一个矩阵
     * @param b int整型vector<vector<>> 第二个矩阵
     * @return int整型vector<vector<>>
     */
    vector<vector<int> > solve(vector<vector<int> >& a, vector<vector<int> >& b) {
        int n=a.size();
        vector<vector<int>>c(n,vector<int>(n,0));
        for(int i=0;i<n;i++){
            for(int k=0;k<n;k++){
                int t=a[i][k];//先访问a[i][k]
                for(int j=0;j<n;j++){
                    c[i][j]+=t*b[k][j];//先计算出所有需要用到a[i][k]的位置,后面再累加
                }
            }
        }return c;
    }
};

复杂度:

  • 时间复杂度:三层循环,图片说明
  • 空间复杂度:辅助空间为相乘后的矩阵c大小为图片说明 ,所以空间复杂度为图片说明