leetcode:311. 稀疏矩阵相乘

题目来源

题目描述

在这里插入图片描述
在这里插入图片描述

题目解析

首先要知道矩阵是怎么相乘的

在这里插入图片描述

在这里插入图片描述
首先,两个矩阵要是想相乘需要满足,第一个矩阵的列数等于第二个矩阵的行数,满足的话就可以相乘得到新的矩阵了

一个mn的矩阵和一个np的矩阵相乘,将会得到一个m*p的矩阵

举个例子:

矩阵a:

1 2 3
3 2 2
2 1 2

矩阵b:

2 2
3 1
2 1

相乘得到的矩阵c是3*2的:

14 7
16 10
11 7

其实就是:

  • 矩阵a的第一行每个元素分别与b的第一列相乘再求和,得到c矩阵的第一个数,
  • 然后a矩阵的第一行再与b矩阵的第二相乘,得到第二个数
  • 然后是a矩阵的第二行与b矩阵的第一列…
1 * 2 + 2 * 3 + 3 * 2 = 14
1 * 2 + 2 * 1 + 3 * 1 = 7
3 * 2 + 2 * 3 + 2 * 2 = 16
3 * 2 + 2 * 1 + 2 * 1 = 10
2 * 2 + 1 * 3 + 2 * 2 = 11
2 * 2 + 1 * 1 + 2 * 1 = 7

观察:

  • C[0][0] = A[0][0] * B[0][0] + A[0][1] * B[1][0] + A[0][2] * B[2][0]
  • C[0][1] = A[0][0] * B[0][1] + A[0][1] * B[1][1] + A[0][2] * B[2][1]
  • C[0][2] = A[0][0] * B[0][2] + A[0][1] * B[1][2] + A[0][2] * B[2][2]
  • C[i][j] = A[i][0] * B[0][j] + A[i][1] * B[1][j] + A[i][2] * B[2][j]

怎么计算呢?

  • 先遍历A[i][j],当A[i][j]不为0时,我们在开始计算:
    • 接下来的问题是,怎么确定B[a][b]
    • 首先,a我们确定下来了,为j
    • 置于b,它是b的第二维,因为再嵌套一个for循环,为b[0].size()
class Solution {
public:
    /**
     * @param a: a sparse matrix
     * @param b: a sparse matrix
     * @return: the result of A * B
     */
    vector<vector<int>> multiply(vector<vector<int>> &a, vector<vector<int>> &b) {
        if(a.empty() || a[0].empty() || b.empty() || b[0].empty()){
            return {};
        }
        std::vector<std::vector<int>> m(a.size(), std::vector<int>(b[0].size(), 0));
        for (int i = 0; i < a.size(); ++i) {
            for (int l = 0; l < a[0].size(); ++l) {
                if(a[i][l] != 0){
                    for (int j = 0; j < b[0].size(); ++j) {
                        m[i][j] += a[i][l] * b[l][j];
                    }
                }
            }
        }
        return m;
    }
};
  • 2
    点赞
  • 4
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值