The Second solution is highly recommended.
#include <vector>
#include <iostream>
#include <map>
using namespace std;
/*
Given two sparse matrics A and B, return the result of AB.
You may assume that A's column number is equal to B's row number.
For example:
A = [
[ 1, 0, 0],
[-1, 0, 3]
]
B = [
[ 7, 0, 0 ],
[ 0, 0, 0 ],
[ 0, 0, 1 ]
]
| 1 0 0 | | 7 0 0 | | 7 0 0 |
AB = | -1 0 3 | x | 0 0 0 | = | -7 0 3 |
| 0 0 1 |
*/
vector< vector<int> > matrixMultiply(vector< vector<int> >& A, vector< vector<int> >& B) {
int m = A.size(), n = A[0].size(), k = B[0].size();
vector< vector<int> > res(m, vector<int>(k, 0));
for(int i = 0; i < m; ++i) {
for(int j = 0; j < n; ++j) {
if(A[i][j] != 0) {
for(int c = 0; c < k; ++c) {
if(B[j][c] != 0) {
res[i][c] = A[i][j] * B[j][c];
}
}
}
}
}
return res;
}
vector< vector<int> > matrixMultiplyII(vector< vector<int> >& A, vector< vector<int> >& B) {
int m = A.size(), n = A[0].size(), l = B[0].size();
vector< vector<int> > res(m, vector<int>(l, 0));
map<int, map<int, int> > tableB;
for(int i = 0; i < n; ++i) {
for(int j = 0; j < l; j++) {
map<int, int> tmp;
tmp.insert({j, B[i][j]});
if(B[i][j] != 0) {tableB[i] = tmp;}
}
}
for(int i = 0; i < m; ++i) {
for(int j = 0; j < n; ++j) {
if(A[i][j] != 0) {
map<int, int> tmp = tableB[j];
auto iter = tmp.begin();
while(iter != tmp.end()) {
res[i][iter->first] += A[i][j] * iter->second;
iter++;
}
}
}
}
return res;
}
int main(void) {
vector< vector<int> > A{
{1, 0, 0},
{-1, 0, 3}};
vector< vector<int> > B{
{7, 0, 0},
{0, 0, 0},
{0, 0, 1}};
vector< vector<int> > res = matrixMultiplyII(A, B);
for(int i = 0; i < res.size(); ++i) {
for(int j = 0; j < res[i].size(); ++j) {
cout << res[i][j] << " ";
}
cout << endl;
}
}