20天刷题计划-542. 01 矩阵

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

一、题目描述:

给定一个由 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]] 示例 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

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

二、思路分析:

本题给出了一个场景:求 mat 中对应位置元素到最近的 0 的距离。就是只能沿着横、竖到达另外一个点走的步数。从一个点出发求这种最短距离的方法很容易想到就是度优先遍历,即把周围这一圈搜索完成之后,再搜索下一圈,是慢慢扩大搜索范围的。

具体做法:

先将矩阵中所有为0的元素的坐标加入到队列,并且设置为已访问标识 从队列首取出元素,从当前节点扩散,扩散的条件是在矩阵范围内且并未被访问过。

同时我们还需要知道最先改变的位置坐标,肯定是最先到达点,也就是最近的,我们将该位置置为true,以后别人慢的到达该位置时,同样不能更改该位置的值

三、AC 代码:

class Solution {
    int[] dx=new int[]{0,1,0,-1};
    int[] dy=new int[]{1,0,-1,0};
    public int[][] updateMatrix(int[][] mat) {
        int m=mat.length;
        int n=mat[0].length;
        Queue<int[]> q=new LinkedList<>();
        boolean[][] flag=new boolean[m][n];
        for(int i=0;i<m;i++){
            for(int j=0;j<n;j++){
                if(mat[i][j]==0){
                    q.offer(new int[]{i,j});
                    flag[i][j]=true;
                } 
            }
        }
        while(!q.isEmpty()){
            int[] temp=q.poll();
            for(int t=0;t<4;t++){
                int x=temp[0]+dx[t];
                int y=temp[1]+dy[t];
                if(x>=0&&x<m&&y>=0&&y<n&&mat[x][y]==1&&!flag[x][y]){
                    q.offer(new int[]{x,y});
                    mat[x][y]=mat[temp[0]][temp[1]]+1;
                    flag[x][y]=true;
                }
            }
        }
        return mat;
    }
}

四、总结:

网络异常,图片无法展示
|

因为要求最近,所以一般会想到用bfs,如果要是求最远,一般会想到用dfs。

深度遍历模板思路: 第一步:明确递归参数 第二步:明确递归终止条件 第三步:明确递归函数中的内容 第四步:明确回溯返回值

广度遍历模板思路: 第一步:设置队列,添加初始节点 第二步:判断队列是否为空 第三步:迭代操作 弹出队列元素,进行逻辑处理 当前队列元素的下级元素,入队 第四步:在此执行步骤三

写题解不易,若对你有帮助,点赞评论再走吧。ヽ(✿゚▽゚)ノ,如有不足,请大家斧正。



相关文章
|
机器学习/深度学习 算法 计算机视觉
Yolov5 + 界面PyQt5 +.exe文件部署运行
Yolov5 + 界面PyQt5 +.exe文件部署运行
|
存储 分布式数据库 Hbase
HBase scan过程简析
HBase scan过程简析。 scan过程总体上是分层处理的,与存储上的组织方式一致,脉络比较清晰; 具体来说,就是region->store→hfile/memstore,分别都有对应的scanner实现进行数据读取; scan请求本身设置的条件,以及server和table层面的一些参数限制,会根据需要分布在不同层次的scanner中进行处理; 2.
2416 0
HBase scan过程简析
|
关系型数据库 MySQL Linux
Navicat15连接本地虚拟机的Mysql(Centos7)
Navicat15连接本地虚拟机的Mysql(Centos7)
927 0
Navicat15连接本地虚拟机的Mysql(Centos7)
|
6月前
|
Web App开发 人工智能
翻译类插件 实现英文文献自由
这是一组提升阅读与学习效率的翻译及语言辅助插件简介,包含:Google 翻译(快速整页翻译)、彩云小译(AI 翻译支持双语对照)、DeepL Translator(高精准度翻译)、Mate Translate(单词翻译带发音例句)和 Readlang Web Reader(生词点击翻译与保存功能)。以上工具各具特色,满足不同场景下的翻译与学习需求。
138 4
|
11月前
|
网络协议 Linux 应用服务中间件
Socket通信之网络协议基本原理
【10月更文挑战第10天】网络协议定义了机器间通信的标准格式,确保信息准确无损地传输。主要分为两种模型:OSI七层模型与TCP/IP模型。
|
存储 数据挖掘 BI
数据仓库深度解析与实时数仓应用案例探析
随着数据量的不断增长和数据应用的广泛深入,数据治理和隐私保护将成为数据仓库建设的重要议题。企业需要建立完善的数据治理体系,确保数据的准确性、一致性和完整性;同时加强隐私保护机制建设,确保敏感数据的安全性和合规性。
1017 55
|
JavaScript 前端开发 C++
使用 Vue-Cli 创建 Vue3+TS 项目并整合 ElementPlus、Axios 等组件或插件
本文详细记录了如何使用Vue-Cli工具创建一个Vue3+TypeScript项目,并整合ElementPlus组件库和Axios等插件,包括项目的创建、配置、启动和插件封装使用等步骤。
663 0
|
存储 数据库
cannot read properties of underfined (reading ‘code‘),别光知道抄,有的时候,细节就是影响全局关键,别人代码到你项目不一定100%正确,判断bug出
cannot read properties of underfined (reading ‘code‘),别光知道抄,有的时候,细节就是影响全局关键,别人代码到你项目不一定100%正确,判断bug出
|
算法
时间复杂度、空间复杂度实践练习(力扣OJ)
时间复杂度、空间复杂度实践练习(力扣OJ)
193 0
vant-函数式组件用法
vant-函数式组件用法
190 0