每天一道leetcode:542. 01 矩阵(图论中等广度优先遍历)

news2025/1/12 17:31:43

今日份题目:

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

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

示例1

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

示例2

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

提示

  • m == mat.length

  • n == mat[i].length

  • 1 <= m, n <= 104

  • 1 <= m * n <= 104

  • mat[i][j] is either 0 or 1.

  • mat 中至少有一个 0

题目思路

找到距离当前位置最近的0,有两种思路,要么从0开始找1,要么从1开始找0。这道题,我们用从0开始找1的方法,这样距离就直接每次加一就可以了。为了简化思路和运算,我们仿照之前那道两岛间的最短距离的题目,将一片0看作一个岛,然后按层外扩,每层的距离就是上一层的距离加一。看作岛就是需要先标记为到达过并将位置放入队列。两道题目的不同之处在于,两岛间距离的题目只需找出最小距离,而这道题需要找到每个点到最近的0的最小距离,所以需要额外的数组实时记录。

bfs应用在按层外扩上,每次从队列中取出符合条件的格子,然后将四周符合条件的格子放入队列。所谓的条件就是:当前位置确实在矩阵中,并且当前位置没有到达过。

代码

class Solution 
{
    

public:
    vector<vector<int>> updateMatrix(vector<vector<int>>& matrix) 
    {

        int n=matrix.size();
        int m=matrix[0].size();
        //上下左右四个方向
        int dirc[4][2]={{-1,0},{1,0},{0,-1},{0,1}};
        vector<vector<int>> dist(n,vector<int>(m)); //记录距离
        vector<vector<int>> visited(n,vector<int>(m)); //标记到达过
        queue<pair<int,int> > p;
        //将矩阵中所有的0添加进初始队列中
        for(int i=0;i<n;i++) 
        {
            for(int j=0;j<m;j++) 
            {
                if(matrix[i][j]==0) 
                {
                    p.push({i,j});
                    visited[i][j]=1; //标记为到达过
                    dist[i][j]=0;
                }
            }
        }

        //bfs
        while(!p.empty()) 
        {
            auto [x,y]=p.front();
            p.pop();
            for(int i=0;i<4;i++) //遍历周围四个方向的格子
            {
                //获取新位置
                int nx=x+dirc[i][0];
                int ny=y+dirc[i][1];
                if(nx>=0&&nx<n&&ny>=0&&ny<m&&visited[nx][ny]==0) 
                {
                    dist[nx][ny]=dist[x][y]+1;
                    p.push({nx,ny});
                    visited[nx][ny]=1; //标记为到达过
                }
            }
        }
        return dist;
    }
};

提交结果

欢迎大家在评论区讨论,如有不懂的部分,欢迎在评论区留言!

更新不易,宝子们点个赞支持下,谢谢!

每天一道leetcode,大家一起在评论区打卡呀!

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/927428.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

如何从“监控”到“可观测性”?

什么是可观测性&#xff1f; 可观测性&#xff08;Observability&#xff09;是一种通过系统产生的输出数据&#xff08;如日志、指标和链路追踪&#xff09;来衡量当前系统运行状态的能力&#xff0c;其源于现代应用系统的复杂性和分布式架构&#xff0c;这些应用系统往往由大…

VUE之jspreadsheet电子excel表格动态高度设置

问题&#xff1a;excel电子表格在不同屏幕大小下横向滚动条会被遮挡 排查原因&#xff1a;由于excel高度固定导致 解决方法&#xff1a;设计页面较多&#xff0c;所以封装公共方法 步骤&#xff1a; 1.使用混入封装动态设置excel高度方法&#xff1a; const mixinJexcel …

达梦数据库分区表介绍

概述 本文将对达梦数据库分区表概念、创建、维护进行介绍。 1.分区表概念 1.1 分区表使用场景 近几年&#xff0c;随着移动支付快速发展&#xff0c;银行交易系统中【移动小微支付场景】使用越来越多&#xff0c;系统中流水账单表数据量巨大&#xff0c;往往上TB。 为了提高…

java八股文面试[JVM]——双亲委派模型

1.当AppClassLoader去加载一个class时&#xff0c;它首先不会自己去尝试加载这个类&#xff0c;而是把类加载请求委托给父加载器ExtClassLoader去完成。 2.当ExtClassLoader去加载一个class时&#xff0c;它首先也不会去尝试加载这个类&#xff0c;而是把类加载请求委托给父加载…

【esp32】GPIO引脚功能使用集合

本文主要介绍 esp32 这块芯片的GPIO 口功能使用以及软硬件设计注意事项 &#x1f4cb; 个人简介 &#x1f496; 作者简介&#xff1a;大家好&#xff0c;我是喜欢记录零碎知识点的小菜鸟。&#x1f60e;&#x1f4dd; 个人主页&#xff1a;欢迎访问我的 Ethernet_Comm 博客主页…

uniapp 安卓平台签名证书(.keystore)生成

安装JRE环境 下载jre安装包&#xff1a;https://www.oracle.com/java/technologies/downloads/#java8安装jre安装包时&#xff0c;记录安装目录(例:C:\Program Files\Java\jdk-20)打开命令行&#xff08;cmd&#xff09;&#xff0c;将JRE安装路径添加到系统环境变量 d: se…

Linux操作系统--linux环境搭建(3)

在上一小节中,我们搭建好了虚拟机,那么接下来,我们在虚拟机上安装我们的Linux操作系统。 1.CentOS安装 下面我们开始在我们创建好的虚拟机上安装CentOS操作系统。流程如下所示: (1).Vmware要求如果需要启动一台虚拟机,需要确保你的电脑主机必须要支持虚拟化的技术。如何…

SLS筛选推送链

* | select "client_ip", "url", count(*) as "number" from log group by "client_ip", "url" order by "number" desc

记录一次presto sql执行报错 Error executing query的解决办法

在执行presto sql 时报错截图如下&#xff1a; 查看后台执行报错日志&#xff1a; java.sql.SQLException: Error executing query at com.facebook.presto.jdbc.PrestoStatement.internalExecute(PrestoStatement.java:307) at com.facebook.presto.jdbc.PrestoStatement.exe…

Alibaba Nacos Authentication Bypass Vulnerability

文章目录 Nacos 提供了四大功能服务发现和服务健康检查动态配置管理动态域名解析服务服务和元数据管理 Alibaba Nacos Authentication Bypass Vulnerability Alibaba Nacos(Dynamic Naming and Configuration Service)是由阿里巴巴公司维护的一款开源项目&#xff0c;易于构建云…

centos7设置静态IP地址

安装完成系统后&#xff0c;接下来就是配置静态IP地址&#xff0c;如下&#xff1a; 进入编辑模式vim /etc/sysconfig/network-scripts/ifcfg-ens33 文件名不一定是ifcfg-ens33&#xff0c;到/etc/sysconfig/network-scripts下面找下是哪个文件 修改 &#xff1a; BOOTPROTO…

Ansible 创建逻辑卷

创建一个名为/ansible/lv.yml 的 playbook &#xff0c;它在所有受管节点上运行以执行下列任务&#xff1a; 创建符合以下要求的逻辑卷&#xff1a; 逻辑卷创建在 research 卷组中 逻辑卷名称为 data 逻辑卷大小为 1500 MiB 使用 ext4 文件系统格式化逻辑卷 如果无法创建请求的…

keepalived + lvs (DR)

目录 一、概念 二、实验流程命令 三、实验的目的 四、实验步骤 一、概念 Keepalived和LVS&#xff08;Linux Virtual Server&#xff09;可以结合使用来实现双机热备和负载均衡。 Keepalived负责监控主备服务器的可用性&#xff0c;并在主服务器发生故障时&#xff0c;将…

盈利能力低于预期,财报发布后股价暴跌97%,达达集团财务前景堪忧

来源&#xff1a;猛兽财经 作者&#xff1a;猛兽财经 财报公布后&#xff0c;达达集团的股价就像坐过山车一样 2023年8月15日美股收盘后&#xff0c;达达集团&#xff08;DADA&#xff09;公布了2023年第二季度财务财报&#xff0c;在财报公布后的短短几天内&#xff0c;达达集…

优先级队列—数据结构

文章目录 1.堆1.1概念1.2性质1.3存储方式1.4堆向下调整创建大根堆1.5堆的插入和删除1.6 2.PriorityQueue2.1定义2.2性质2.3 PriorityQueue常用接口介绍2.4方法的使用2.5对复杂类型的PriorityQueue的使用 3.堆的应用3.1PriorityQueue的实现3.2Top-k问题3.3堆排序 4.经典习题 1.堆…

【校招VIP】专业课考点之死锁检测与恢复

考点介绍&#xff1a; 根据不少同学的面试反馈&#xff0c;最近阿里和字节跳动面试时面试官都问到了死锁问题。如字节跳动考察的问题是&#xff1a;什么是线程死锁&#xff1f;死锁如何产生&#xff1f;死锁如何检测与恢复&#xff1f;其产生的原理与对应的解决方案都是重点考察…

跨境电商服务商哪家靠谱,要怎么选择?

随着全球市场的不断扩大&#xff0c;跨境电商已成为众多企业进军国际贸易的重要途径。然而&#xff0c;跨境电商涉及的法规、市场策略、国际物流等方面的知识相当复杂&#xff0c;因此&#xff0c;寻找一个优质的跨境电商培训中心成为了企业不可或缺的需求。本文将为您介绍如何…

什么气传导蓝牙耳机好?气传导耳机最新品牌推荐

​传统入耳式耳机佩戴着容易滑落&#xff0c;戴不稳&#xff0c;久戴耳朵酸痛等问题&#xff0c;气传导耳机的出现就避免了这些问题的发生&#xff0c;我来推荐几款市面上热销火爆且使用感不错的气传导耳机给到大家&#xff0c;来看看吧&#xff01; 一、南卡00压开放式耳机&a…

汉诺塔问题--夏令营

题目 tips&#xff1a; 1.本题只用多试几次&#xff0c;由数据推导规律即可 2.汉诺塔问题分析 这里的递归函数是&#xff08;n,a,b,c&#xff09;指n个盘子从a移到c&#xff0c;且凭借b 递归边界是n1 原始思想&#xff1a;要想把n个盘子从a移到c,若n1则直接move a到c n>…

Web3.0的五大趋势,你是否已经了解?

&#x1f935;‍♂️ 个人主页&#xff1a;艾派森的个人主页 ✍&#x1f3fb;作者简介&#xff1a;Python学习者 &#x1f40b; 希望大家多多支持&#xff0c;我们一起进步&#xff01;&#x1f604; 如果文章对你有帮助的话&#xff0c; 欢迎评论 &#x1f4ac;点赞&#x1f4…