【力扣算法题】矩阵

【力扣算法题】矩阵



题目介绍

题号542

给定一个由 0 和 1 组成的矩阵 mat ,请输出一个大小相同的矩阵,其中每一个格子是 mat 中对应位置元素到最近的 0 的距离。

两个相邻元素间的距离为 1 。

示例 1:

在这里插入图片描述

输入:mat = [[0,0,0],[0,1,0],[0,0,0]]
输出:[[0,0,0],[0,1,0],[0,0,0]]

来源:力扣(LeetCode)
链接:https://leetcode-cn.com/problems/01-matrix


题解

1. 广度优先(个人解法/力扣官方解法1)

这题是个可以常常套用的模板,我个人更愿意称之它为“矩阵最短路径”问题,其实就是矩阵里面非0元素到0元素的最短距离。

我一开始确确实实想到了广度优先的办法来解决,但是我的广度优先比较暴力,也就是对于每个点都进行一次广度优先,很明显,超时了哈哈

仔细一想确实这样很有问题,一次广度优先本身就可以遍历访问所有节点,有没有办法利用这个特性来减少计算量呢?

其实最好的办法就是让所有0节点作为一个多叉树第一层的节点,之后进行广度优先就能把每一层的节点找到并给他们标记正确的距离,只是这样的多叉树没有根节点是不合法的,所以我们只利用广度优先的思想,假设我们有一个“抽象的根节点”,所有的0都连接着这个抽象的根节点,我们再进行广度优先

C++源码:

class Solution {
   
private:
    static constexpr int dirs[4][2] = {
   {
   -1, 0}, {
   1, 0}, {
   0, -1}, {
   0, 1}};
public:
    vector<vector<int>> updateMatrix(vector<vector<int>>& mat) {
   
        unsigned int rl = mat.size();
        unsigned int cl = mat[0].size();
        queue<pair<int, int>> q;
        vector<vector<int>> 
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值