Skip to content

Commit 908ac55

Browse files
committed
0311. 稀疏矩阵的乘法
1 parent 7cf2e95 commit 908ac55

File tree

1 file changed

+90
-0
lines changed

1 file changed

+90
-0
lines changed
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,90 @@
1+
package leetcode_0311_sparse_matrix_multiplication
2+
3+
// 0311. 稀疏矩阵的乘法
4+
// https://leetcode.cn/problems/sparse-matrix-multiplication/
5+
6+
// multiply 直接计算
7+
// 时间复杂度: O(m*n*k)
8+
// 空间复杂度: O(mn)
9+
func multiply(mat1 [][]int, mat2 [][]int) [][]int {
10+
var (
11+
m, k, n = len(mat1), len(mat1[0]), len(mat2[0])
12+
ans = make([][]int, m)
13+
)
14+
for i := 0; i < m; i++ {
15+
ans[i] = make([]int, n)
16+
}
17+
18+
for i := 0; i < m; i++ {
19+
for j := 0; j < n; j++ {
20+
for p := 0; p < k; p++ {
21+
ans[i][j] += mat1[i][p] * mat2[p][j]
22+
}
23+
}
24+
}
25+
return ans
26+
}
27+
28+
// multiply_2 直接计算(优化)
29+
// 时间复杂度: O(m*n*k)
30+
// 空间复杂度: O(mn)
31+
func multiply_2(mat1 [][]int, mat2 [][]int) [][]int {
32+
var (
33+
m, k, n = len(mat1), len(mat1[0]), len(mat2[0])
34+
ans = make([][]int, m)
35+
)
36+
for i := 0; i < m; i++ {
37+
ans[i] = make([]int, n)
38+
}
39+
40+
for i := 0; i < m; i++ {
41+
for p := 0; p < k; p++ {
42+
if mat1[i][p] == 0 {
43+
continue
44+
}
45+
for j := 0; j < n; j++ {
46+
ans[i][j] += mat1[i][p] * mat2[p][j]
47+
}
48+
}
49+
}
50+
return ans
51+
}
52+
53+
// multiply_3 工程优化(空间换时间)
54+
// 时间复杂度: O(m*n)
55+
// 空间复杂度: O(mn)
56+
func multiply_3(mat1 [][]int, mat2 [][]int) [][]int {
57+
var (
58+
m, n = len(mat1), len(mat2[0])
59+
ans = make([][]int, m)
60+
)
61+
for i := 0; i < m; i++ {
62+
ans[i] = make([]int, n)
63+
}
64+
65+
noneZeroA := getNoneZeroMat(mat1)
66+
noneZeroB := getNoneZeroMat(mat2)
67+
for _, m1 := range noneZeroA {
68+
for _, m2 := range noneZeroB {
69+
// 这里这么判断的原因:mat1和mat2相乘,
70+
// 只有mat1的数据的列数和mat2的行数相等才会进行计算
71+
if m1[1] == m2[0] {
72+
ans[m1[0]][m2[1]] += m1[2] * m2[2]
73+
}
74+
}
75+
}
76+
return ans
77+
}
78+
79+
func getNoneZeroMat(matrix [][]int) [][]int {
80+
m, n := len(matrix), len(matrix[0])
81+
var ans [][]int
82+
for i := 0; i < m; i++ {
83+
for j := 0; j < n; j++ {
84+
if matrix[i][j] != 0 {
85+
ans = append(ans, []int{i, j, matrix[i][j]})
86+
}
87+
}
88+
}
89+
return ans
90+
}

0 commit comments

Comments
 (0)