Given two sparse matrices mat1
of size m x k
and mat2
of size k x n
, return the result of mat1 x mat2
. You may assume that multiplication is always possible.
Example 1:
Input: mat1 = [[1,0,0],[-1,0,3]], mat2 = [[7,0,0],[0,0,0],[0,0,1]] Output: [[7,0,0],[-7,0,3]]
Example 2:
Input: mat1 = [[0]], mat2 = [[0]] Output: [[0]]
Constraints:
m == mat1.length
k == mat1[i].length == mat2.length
n == mat2[i].length
1 <= m, n, k <= 100
-100 <= mat1[i][j], mat2[i][j] <= 100
class Solution:
def multiply(self, mat1: List[List[int]], mat2: List[List[int]]) -> List[List[int]]:
r1, c1, c2 = len(mat1), len(mat1[0]), len(mat2[0])
res = [[0] * c2 for _ in range(r1)]
for i in range(r1):
for j in range(c2):
for k in range(c1):
res[i][j] += mat1[i][k] * mat2[k][j]
return res
class Solution:
def multiply(self, mat1: List[List[int]], mat2: List[List[int]]) -> List[List[int]]:
r1, c1, c2 = len(mat1), len(mat1[0]), len(mat2[0])
res = [[0] * c2 for _ in range(r1)]
mp = defaultdict(list)
for i in range(r1):
for j in range(c1):
if mat1[i][j] != 0:
mp[i].append(j)
for i in range(r1):
for j in range(c2):
for k in mp[i]:
res[i][j] += mat1[i][k] * mat2[k][j]
return res
class Solution {
public int[][] multiply(int[][] mat1, int[][] mat2) {
int r1 = mat1.length, c1 = mat1[0].length, c2 = mat2[0].length;
int[][] res = new int[r1][c2];
Map<Integer, List<Integer>> mp = new HashMap<>();
for (int i = 0; i < r1; ++i) {
for (int j = 0; j < c1; ++j) {
if (mat1[i][j] != 0) {
mp.computeIfAbsent(i, k -> new ArrayList<>()).add(j);
}
}
}
for (int i = 0; i < r1; ++i) {
for (int j = 0; j < c2; ++j) {
if (mp.containsKey(i)) {
for (int k : mp.get(i)) {
res[i][j] += mat1[i][k] * mat2[k][j];
}
}
}
}
return res;
}
}
class Solution {
public:
vector<vector<int>> multiply(vector<vector<int>>& mat1, vector<vector<int>>& mat2) {
int r1 = mat1.size(), c1 = mat1[0].size(), c2 = mat2[0].size();
vector<vector<int>> res(r1, vector<int>(c2));
unordered_map<int, vector<int>> mp;
for (int i = 0; i < r1; ++i)
{
for (int j = 0; j < c1; ++j)
{
if (mat1[i][j] != 0) mp[i].push_back(j);
}
}
for (int i = 0; i < r1; ++i)
{
for (int j = 0; j < c2; ++j)
{
for (int k : mp[i]) res[i][j] += mat1[i][k] * mat2[k][j];
}
}
return res;
}
};
func multiply(mat1 [][]int, mat2 [][]int) [][]int {
r1, c1, c2 := len(mat1), len(mat1[0]), len(mat2[0])
res := make([][]int, r1)
for i := range res {
res[i] = make([]int, c2)
}
mp := make(map[int][]int)
for i := 0; i < r1; i++ {
for j := 0; j < c1; j++ {
if mat1[i][j] != 0 {
mp[i] = append(mp[i], j)
}
}
}
for i := 0; i < r1; i++ {
for j := 0; j < c2; j++ {
for _, k := range mp[i] {
res[i][j] += mat1[i][k] * mat2[k][j]
}
}
}
return res
}