SinCatGit/LeetCodeGo

311.稀疏矩阵乘法

Closed this issue · 0 comments

题目

311.稀疏矩阵乘法

给定两个 稀疏矩阵 A 和 B,返回AB的结果。
您可以假设A的列数等于B的行数。

示例 1:

输入:
[
    [ 1, 0, 0],
    [-1, 0, 3]
]

[
    [7, 0, 0],
    [0, 0, 0],
    [0, 0, 1]
]

输出:
[
    [ 7, 0, 0],
    [-7, 0, 3]
]

解释:
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 |

思路:

稀疏矩阵的特点是矩阵中绝大多数的元素为0,而相乘的结果是还应该是稀疏矩阵,即还是大多数元素为0,那么我们使用传统的矩阵相乘的算法肯定会处理大量的0乘0的无用功,所以核心思路是只做非零的乘法运算。

一个 i x k 的矩阵A乘以一个 k x j 的矩阵B会得到一个 i x j 大小的矩阵C。

C[i][j] = A[i][0]*B[0][j] + A[i][1]*B[1][j] + ... + A[i][k]*B[k][j]

那么为了不重复计算0乘0,首先遍历A数组,要确保A[i][k]不为0,才继续计算,然后遍历B矩阵的第k行,如果B[K][J]不为0,我们累加结果矩阵res[i][j] += A[i][k] * B[k][j]