题目来源
题目描述
题目解析
首先要知道矩阵是怎么相乘的
首先,两个矩阵要是想相乘需要满足,第一个矩阵的列数等于第二个矩阵的行数,满足的话就可以相乘得到新的矩阵了
一个mn的矩阵和一个np的矩阵相乘,将会得到一个m*p的矩阵
举个例子:
矩阵a:
1 2 3
3 2 2
2 1 2
矩阵b:
2 2
3 1
2 1
相乘得到的矩阵c是3*2的:
14 7
16 10
11 7
其实就是:
- 矩阵a的第一行每个元素分别与b的第一列相乘再求和,得到c矩阵的第一个数,
- 然后a矩阵的第一行再与b矩阵的第二列相乘,得到第二个数
- 然后是a矩阵的第二行与b矩阵的第一列…
1 * 2 + 2 * 3 + 3 * 2 = 14
1 * 2 + 2 * 1 + 3 * 1 = 7
3 * 2 + 2 * 3 + 2 * 2 = 16
3 * 2 + 2 * 1 + 2 * 1 = 10
2 * 2 + 1 * 3 + 2 * 2 = 11
2 * 2 + 1 * 1 + 2 * 1 = 7
观察:
- C[0][0] = A[0][0] * B[0][0] + A[0][1] * B[1][0] + A[0][2] * B[2][0]
- C[0][1] = A[0][0] * B[0][1] + A[0][1] * B[1][1] + A[0][2] * B[2][1]
- C[0][2] = A[0][0] * B[0][2] + A[0][1] * B[1][2] + A[0][2] * B[2][2]
- C[i][j] = A[i][0] * B[0][j] + A[i][1] * B[1][j] + A[i][2] * B[2][j]
怎么计算呢?
- 先遍历A[i][j],当A[i][j]不为0时,我们在开始计算:
- 接下来的问题是,怎么确定B[a][b]
- 首先,a我们确定下来了,为j
- 置于b,它是b的第二维,因为再嵌套一个for循环,为b[0].size()
class Solution {
public:
/**
* @param a: a sparse matrix
* @param b: a sparse matrix
* @return: the result of A * B
*/
vector<vector<int>> multiply(vector<vector<int>> &a, vector<vector<int>> &b) {
if(a.empty() || a[0].empty() || b.empty() || b[0].empty()){
return {};
}
std::vector<std::vector<int>> m(a.size(), std::vector<int>(b[0].size(), 0));
for (int i = 0; i < a.size(); ++i) {
for (int l = 0; l < a[0].size(); ++l) {
if(a[i][l] != 0){
for (int j = 0; j < b[0].size(); ++j) {
m[i][j] += a[i][l] * b[l][j];
}
}
}
}
return m;
}
};