大厂面试真题详解:稀疏矩阵乘法

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

在线评测地址:领扣题库官网

样例1

Input: 
[[1,0,0],[-1,0,3]]
[[7,0,0],[0,0,0],[0,0,1]]
Output:
[[7,0,0],[-7,0,3]]
Explanation:
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 |

样例2

Input:
[[1,0],[0,1]]
[[0,1],[1,0]]
Output:
[[0,1],[1,0]]

算法:模拟

思路
矩阵乘法的实现:一个m行n列的矩阵A,与一个n行p列的矩阵B可以相乘,得到的结果AB是一个m行p列的矩阵,其中的第i行第j列位置上的数AB(i,j)为,矩阵A第i行上的n个数与矩阵B第j列上的n个数一一对应相乘后,所得到的n个乘积之和。直接模拟即可。

复杂度分析

空间复杂度O(n^2)
时间复杂度O(n^3)

public class Solution {
    /**
     * @param A: a sparse matrix
     * @param B: a sparse matrix
     * @return: the result of A * B
     */
    public int[][] multiply(int[][] A, int[][] B) {
        int rowA = A.length, columnA = A[0].length;
        int rowB = B.length, columnB = B[0].length;
        // AB为 rowA * columnB 大小的矩阵
        int[][] AB = new int [rowA][columnB];
        for (int i = 0; i < rowA; i++){
            for (int j = 0; j < columnB; j++){
                // 求出每一项
                int sum = 0;
                for (int k = 0; k < columnA; k++){
                    sum += A[i][k] * B[k][j];
                }
                AB[i][j] = sum;
            }
        }
        return AB;
    }
}

更多题解参考:九章官网solution

上一篇:算法面试真题详解:合并k个排序数组


下一篇:算法面试真题详解:滑动窗口内数的和