Leetcode 542. 01 矩阵

542. 01 矩阵-中等

问题描述

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

解题思路与代码实现一

采用BFS搜索解题:

  1. 创建标记数组visited用于标记已访问过的元素,初始化均为Integer.MAX_VALUE(不小于可能的最大步长m+n-1),因为在BFS的过程中,先被访问的元素的步长一定小于等于后被访问的元素;创建队列queue用于实现BFS,初始化均为false;
  2. 扫描mat数组,需要把所有mat[i][j]为0的元素加入队列并标记为已访问;
  3. 接着扫描队列,当队列不为空时,队头元素出队,依次访问其上下左右的周围点,如果未发生数组越界且该周围点没被访问过,则将其入队并标记为已访问(true),同时更新周围点的步长 = 出队元素的步长 +1;
public int[][] updateMatrix2(int[][] mat) {// m、n分别表示矩阵的行数和列数int m = mat.length, n = mat[0].length;// 依次表示 上、左、下、右周围四个点的偏移量int[][] dirs = {{-1, 0}, {0, -1}, {1, 0}, {0, 1}};// BFS用的队列Queue<int[]> queue = new LinkedList<>();// 标记数组boolean[][] visited = new boolean[m][n];for (int i = 0; i < m; i++) {// 标记数组初始化全为false,mat[i][j]为0的元素会被标记为trueArrays.fill(visited[i], false);for (int j = 0; j < n; j++) {if (mat[i][j] == 0) {// mat[j][j]为0的元素标记为true并优先入队visited[i][j] = true;queue.offer(new int[]{i, j});} else {mat[i][j] = Integer.MAX_VALUE;}}}while (!queue.isEmpty()) {// 从队列中取出访问过的一个元素作为当前点,访问其周围点int[] current = queue.poll();int currentX = current[0];int currentY = current[1];for (int[] dir : dirs) {// 依次表示 上、左、下、右周围四个点的x、y坐标int x = currentX + dir[0];int y = currentY + dir[1];// 如果坐标未越界,且该周围点mat[x][y]未被访问过(由BFS概念可知,先被访问的的mat[i][j]一定不会超过后访问的)// 也可以不使用标记数组,替换为判断 不越界 且 当前点的距离小于周围点(mat[currentX][currentY] < mat[x][y]),但效率却更低些if (x >= 0 && x < m && y >= 0 && y < n && !visited[x][y]) {// 标记访问过,并入队visited[x][y] = true;queue.offer(new int[]{x, y});// 更新值mat[x][y] = mat[currentX][currentY] + 1;}}}return mat;
}

解题思路与代码实现二

采用动态规划:

先找最优子结构,很明显,一个点的最短距离应该是它周围上下左右四个点(如果存在的话)的最短距离+1,即:

外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传

dp[i][j]表示(i,j)到0的最短距离,但由于0所在位置不固定,所以先将dp数组初始化:mat[i][j]为0,则dp[i][j]取0,否则dp[i][j]取20000(最长距离:m+n-1=19999<20000)。然后为分两轮进行比较:

  1. 第一轮从左到右从上到下扫描mat数组,dp[i][j]mat[i-1][j]+1mat[i][j-1]+1dp[i][j]的最小值,需要注意下标越界;
  2. 第二轮从右到左从下到上扫描mat数组,dp[i][j]mat[i][j+1]+1mat[i+1][j]+1dp[i][j]的最小值,需要注意下标越界;

两轮扫描结束后,dp[i][j]表示(i,j)到0的最短距离,即为所求

		public int[][] updateMatrix(int[][] mat) {// m、n分别表示矩阵的行数和列数int m = mat.length, n = mat[0].length;// dp数组int[][] dp = new int[m][n];// dp数组初始化for (int i = 0; i < m; i++) {for (int j = 0; j < n; j++) {// 19999为1 <= m, n <= 104条件下,可能出现的最大长度 m + n -1dp[i][j] = mat[i][j] == 0 ? 0 : 20000;}}// 先更新左边和上边的最小值for (int i = 0; i < m; i++) {for (int j = 0; j < n; j++) {// 判断上边是否越界if (i - 1 >= 0) {dp[i][j] = Math.min(dp[i - 1][j] + 1, dp[i][j]);}// 判断左边是否越界if (j - 1 >= 0) {dp[i][j] = Math.min(dp[i][j - 1] + 1, dp[i][j]);}}}// 再更新右边和下边的最小值for (int i = m - 1; i >= 0; i--) {for (int j = n - 1; j >= 0; j--) {if (i + 1 < m) {dp[i][j] = Math.min(dp[i + 1][j] + 1, dp[i][j]);}if (j + 1 < n) {dp[i][j] = Math.min(dp[i][j + 1] + 1, dp[i][j]);}}}return dp;}

参考链接:

【LeetCode】 542. 01 矩阵 动态规划 dp

LeetCode] 542. 01 Matrix 零一矩阵

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

如若内容造成侵权/违法违规/事实不符,请联系长河编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

利用AI Chat 将电子书自动截屏并保存成pdf文件

电子书如果要下载下来&#xff0c;无非就两种类型的方法&#xff0c;一种是从内部破解&#xff0c;通常是某些极客将软件破解成免费版&#xff0c;但是风险也大。另一种是从外部破解&#xff0c;就是截屏保存&#xff0c;然后将所有图片拼成pdf文件。 如果要将整本电子书截屏保…

【计算机网络】路由器的工作原理

文章目录 输入端口处理和基于目的地转发交换结构输出端口处理排队问题参考资料 路由器的四个组件 输入端口(input port)&#xff1a;执行物理层功能&#xff08;input port 左边方框、output port 右边方框&#xff09;、数据链路层功能&#xff08;input/output port 中间方框…

springboot+vue基于Hadoop短视频流量数据分析与可视化系统的设计与实现【内含源码+文档+部署教程】

博主介绍&#xff1a;✌全网粉丝10W,前互联网大厂软件研发、集结硕博英豪成立工作室。专注于计算机相关专业毕业设计项目实战6年之久&#xff0c;选择我们就是选择放心、选择安心毕业✌ &#x1f345;由于篇幅限制&#xff0c;想要获取完整文章或者源码&#xff0c;或者代做&am…

Istio 实战

文章目录 Istio流量管理分享会【1】什么是istio?【2】istio 可以干什么?【3】业务中的痛点?【4】istio 高级流量管理5.1 istio 组件介绍与原理5.2 sidercar何时注入?如何控制是否注入?5.3 查看sidecar 容器插入的容器中的iptablesDestination RuleVirtual ServiceGateways…

Qt 自定义标题栏,最小化、最大化、关闭窗口,双击最大化,鼠标拖动等效果实现

文章目录 前言效果代码.pro文件widget.hwidget.cppwidget.uititle.htitle.cpptitle.ui 前言 本次实验内容为Qt自定义标题栏&#xff0c;最小化、最大化、关闭窗口&#xff0c;双击最大化&#xff0c;鼠标拖动等界面软件的基本常规操作。 我们在做一个软件界面的时候&#xff…

NEFU数字图像处理(三)图像分割

一、图像分割的基本概念 1.1专有名词 前景和背景 在图像分割中&#xff0c;我们通常需要将图像分为前景和背景两个部分。前景是指图像中我们感兴趣、要分割出来的部分&#xff0c;背景是指和前景不相关的部分。例如&#xff0c;对于一张人物照片&#xff0c;人物就是前景&…

LIMZO-A-6/210开环控制比例插装阀控制器

LICZO-A-4/100、LIMZO-A-6/210、LIRZO-A-3/350、LIMZO-A-8/315、LICZO-A-3/100、LIRZO-A-6/210、LICZO-A-2/210二通数字式比例插装阀可分别执行: 压力补偿溢流和减压开环功能。此类阀有不同的型式可供选择:A型&#xff0c;与分体式放大器配合使用AEB型&#xff0c;带基本型集成…

Mybatis—XML配置文件、动态SQL

学习完Mybatis的基本操作之后&#xff0c;继续学习Mybatis—XML配置文件、动态SQL。 目录 Mybatis的XML配置文件XML配置文件规范XML配置文件实现MybatisX的使用 Mybatis动态SQL动态SQL-if条件查询 \<if\>与\<where\>更新员工 \<set\>小结 动态SQL-\<forea…

linux的使用学习(1)

Linux 修改root密码 1.以 root 用户或具有 sudo 权限的登录到 Linux 系统。 2.打终端&#xff0c;并执行以下命令以更改 root 用户的密码&#xff1a; sudo passwd root 3.然后&#xff0c;系统会要求你输入新的 root 密码。请注意&#xff0c;在输入密码时&#xff0c;终端界…

深入了解 Elasticsearch 8.1 中的 Script 使用

一、什么是 Elasticsearch Script&#xff1f; Elasticsearch 中的 Script 是一种灵活的方式&#xff0c;允许用户在查询、聚合和更新文档时执行自定义的脚本。这些脚本可以用来动态计算字段值、修改查询行为、执行复杂的条件逻辑等等。 二、支持的脚本语言有哪些 支持多种脚本…

JavaWeb——关于servlet种mapping地址映射的一些问题

6、Servlet 6.4、Mapping问题 一个Servlet可以指定一个映射路径 <servlet-mapping><servlet-name>hello</servlet-name><url-pattern>/hello</url-pattern> </servlet-mapping>一个Servlet可以指定多个映射路径 <servlet-mapping>&…

音视频技术开发周刊 | 317

每周一期&#xff0c;纵览音视频技术领域的干货。 新闻投稿&#xff1a;contributelivevideostack.com。 MIT惊人再证大语言模型是世界模型&#xff01;LLM能分清真理和谎言&#xff0c;还能被人类洗脑 MIT等学者的「世界模型」第二弹来了&#xff01;这次&#xff0c;他们证明…

中文编程工具免费版下载,中文开发语言工具免费版下载

中文编程工具免费版下载&#xff0c;中文开发语言工具免费版下载 中文编程工具开发的实际部分案例如下图 编程系统化课程总目录及明细&#xff0c;点击进入了解详情。 https://blog.csdn.net/qq_29129627/article/details/134073098?spm1001.2014.3001.5502

异步 AIMD 收敛

给出的一直都是同步 AIMD 收敛&#xff0c;所以简单&#xff0c;但不至于 bbr 单流情形退化成简陋。 给出一个异步 AIMD 收敛过程是必要的&#xff0c;可见&#xff0c;它同样是简洁优美的&#xff1a; 虽然我没有标注太多&#xff0c;它始终没有成为一团乱麻。 和同步 AIM…

softmax的高效CUDA编程和oneflow实现初步解析

本文参考了添加链接描述,其中oneflow实现softmax的CUDA编程源代码参考链接添加链接描述 关于softmax的解读以及CUDA代码实现可以参考本人之前编写的几篇文章添加链接描述,添加链接描述,添加链接描述 下面这个图片是之前本人实现的softmax.cu经过接入python接口,最终和pytor…

06、SpringCloud -- 订单详情界面实现

目录 订单详情界面实现需求&#xff1a;代码前端后端controllerservicemapperdomain 效果&#xff1a; 订单详情界面实现 需求&#xff1a; 现在的订单详情界面是这样的。需要获取订单的数据对这个详情页面进行渲染 代码 前端 后端 controller service mapper domain 日…

低功耗设计-ir drop的signoff corner怎么选择?

我正在「拾陆楼」和朋友们讨论有趣的话题&#xff0c;你⼀起来吧&#xff1f; 拾陆楼知识星球入口 相关文章链接: Multi Voltage Flow笔记 有几个方向&#xff0c;看公司需求吧 1.功耗最差的&#xff1b; 2.tt的&#xff08;tt85 是比较接近芯片真实工作情况的&#xff09…

Hbase

目录 1 概述 1.1 HBase 数据模型 1.1.1 HBase 逻辑结构 1.1.2 HBase 物理存储结构 1.1.3 数据模型 1.2 HBase 基本架构 2 HBase 快速入门 2.1 HBase 安装部署 hadoop3.X和Hbase2.X不兼容问题&#xff1a; 2.2 基本操作 3 HBase API 3.1 环境准备 3.2 创建连接 3.2.1 单线程创建…

【数据结构】数组和字符串(七):特殊矩阵的压缩存储:三元组表的转置、加法、乘法操作

文章目录 4.2.1 矩阵的数组表示4.2.2 特殊矩阵的压缩存储a. 对角矩阵的压缩存储b~c. 三角、对称矩阵的压缩存储d. 稀疏矩阵的压缩存储——三元组表4.2.3三元组表的转置、加法、乘法、操作转置加法乘法算法测试实验结果代码整合 4.2.1 矩阵的数组表示 【数据结构】数组和字符串…

github搜索技巧探索

毕设涉及到推荐系统&#xff0c;那么就用搜索推荐系统相关资料来探索一下GitHub的搜搜技巧 文章目录 1. 基础搜索2. 限定在特定仓库搜索3. 按照语言搜索4. 按照star数量搜索5. 搜索特定用户/组织的仓库6. 查找特定文件或路径7. 按时间搜索8. 搜索不包含某个词的仓库9. 搜索特定…