当前位置: 首页 > news >正文

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 零一矩阵

相关文章:

Leetcode 542. 01 矩阵

542. 01 矩阵-中等 问题描述 给定一个由 0 和 1 组成的矩阵 mat &#xff0c;请输出一个大小相同的矩阵&#xff0c;其中每一个格子是 mat 中对应位置元素到最近的 0 的距离。 两个相邻元素间的距离为 1 。 示例 1&#xff1a; 输入&#xff1a;mat [[0,0,0],[0,1,0],[0…...

分享一下微信小程序抽奖链接怎么做

标题&#xff1a;微信小程序抽奖链接制作全攻略&#xff0c;轻松玩转营销抽奖活动 一、引言 在当今的数字化时代&#xff0c;抽奖活动已经成为一种高效的市场营销策略&#xff0c;而微信小程序作为一个功能强大的移动端平台&#xff0c;为企业和个人提供了制作抽奖链接的便捷…...

MathType2024破解版激活序列号

MathType序列号是一款针对该软件而制作的激活工具&#xff0c;大家都知道这款软件在官方是需要花钱购买的&#xff0c;不然得话就只能试用。有很多功能都无法正常使用&#xff01;而本序列号却可以完美的解决这一难题&#xff0c;因为它可以破解并激活“MathType”&#xff0c;…...

简述对 Spring MVC 的理解

SpringMVC 是一种基于 Java 语言开发&#xff0c;实现了 Web MVC 设计模式&#xff0c;请求驱动类型的轻量级 Web 框架。 Spring MVC组件 MVC 架构模式的思想&#xff0c;通过把 Model&#xff0c;View&#xff0c;Controller 分离&#xff0c;将 Web 层进行职责解耦&#xff0…...

Redis——哨兵模式与Zookeeper选举的异同点

摘要 当我们使用主从复制出现的问题&#xff1a;手动故障转移&#xff1a;写能力和存储能力受限&#xff1a;主从复制 -master 宕机故障处理。 主从切换技术的方法是&#xff1a;当主服务器宕机后&#xff0c;需要手动把一台从服务器切换为主服务器&#xff0c;这就需要人工干…...

基于 Center 的 3D 目标检测和跟踪

论文地址&#xff1a;https://arxiv.org/abs/2006.11275 论文代码&#xff1a;https://github.com/tianweiy/CenterPoint 3D 目标通常表示为点云中的 3D Boxes。 CenterPoint 在第一阶段&#xff0c;使用关键点检测器检测对象的中心&#xff0c;然后回归到其他属性&#xff0…...

华锐技术何志东:证券核心交易系统分布式改造将迎来规模化落地阶段

近年来&#xff0c;数字化转型成为证券业发展的下一战略高地&#xff0c;根据 2021 年证券业协会专项调查结果显示&#xff0c;71% 的券商将数字化转型列为公司战略任务。 在落地数字化转型战略过程中&#xff0c;证券业核心交易系统面临着不少挑战。构建新一代分布式核心交易…...

数据结构 -- ArrayList与LinkedList的区别

一、二者的相同点 1&#xff0c;它们都是继承自List接口。 二、二者的区别 1&#xff0c;数据结构&#xff1a;ArrayList是&#xff08;Array动态数组&#xff09;的数据结构&#xff1b;而LinkedList是&#xff08;Link双向链表&#xff09;的数据结构。ArrayList 自由性较…...

豪车托运为什么选小板

小板运输是一种适用于豪车客户的高效运输方式。它提供了快速、安全、便捷的服务&#xff0c;并且相对经济实惠。以下是关于小板运输的时效和价格的介绍&#xff1a; 时效&#xff1a;小板运输通常能够在短时间内完成车辆的运输。具体时效取决于起点和目的地之间的距离&#xff…...

【base64加密】js/ts的基础加密

base64的字符串简单加密&#xff0c;主用于网页缓存数据的加密。 适用于常规html、小游戏&#xff08;egret、cocos、laya&#xff09;等 原文参考&#xff1a;JS基于base64编码加密解密文本和图片&#xff08;修订&#xff09;_js base64加密-CSDN博客 测试&#xff1a;JS实…...

基于python的app程式开发

安装的库文件&#xff1a; 运行代码&#xff1a; # -*- coding:utf-8 -*- from kivy.app import App class HelloApp(App):pass if __name__ __main__:HelloApp().run() 结果画面&#xff1a;...

Spring Event学习

Spring Event学习 观察者模式是一种行为设计模式&#xff0c;它定义了对象之间的依赖关系&#xff0c;当一个对象的状态发生改变时&#xff0c;所有依赖于它的对象都会得到通知并被自动更新。在这个模式中&#xff0c;改变状态的对象被称为主题&#xff0c;依赖的对象被称为观…...

UE4 HLSL学习笔记

在Custom配置对应ush文件路径 在HLSL中写入对应代码 Custom里面增加两个Input&#xff0c;名字必须和ush文件内的未知变量名字一样 然后就对应输出对应效果的颜色 这就是简单的加法运算 减法同理&#xff1a; 乘法除法同理 HLSL取最小值 HLSL取最大值 绝对值&#xff1a; 取余…...

报文的路由过程

路由转发过程 记住路由转发过程结论&#xff1a;报文ip是不变&#xff0c;mac改变。 mac地址在同一个广播域传输过程中是不变的&#xff1b;在跨越广播域的时候会发生改变的&#xff1b;而IP地址在传输过程中是不会改变的&#xff08;除NAT的时候&#xff09;。 ip地址本质上是…...

【CPP】类和对象

1- Classes and Objects Structures A struct in C is a type consisting of a sequence of data membersSome functions/Statements are needed to operate the data members of an object of a struct type 不不小心操作错误&#xff0c;不小心越界 Classes You should b…...

【多线程面试题二十】、 如何实现互斥锁(mutex)?

文章底部有个人公众号&#xff1a;热爱技术的小郑。主要分享开发知识、学习资料、毕业设计指导等。有兴趣的可以关注一下。为何分享&#xff1f; 踩过的坑没必要让别人在再踩&#xff0c;自己复盘也能加深记忆。利己利人、所谓双赢。 面试官&#xff1a;如何实现互斥锁&#xf…...

hypercube背景设置为白色,绘制高光谱3D立方体

import scipy pip install wxpython PyOpenGL和Spectral需要本地安装 可参考链接https://blog.csdn.net/qq_43204333/article/details/119837870 参考&#xff1a;https://blog.csdn.net/Tiandailan/article/details/132719745?spm1001.2014.3001.5506Mouse Functions:left-cl…...

Visual Studio(VS)C++项目 管理第三方依赖库和目录设置

发现很多程序员存在这种做法&#xff1a;把项目依赖的第三方库的lib和dll放在项目目录下&#xff0c;或者复制到输出目录&#xff0c;因为每种配置都有不同的输出目录&#xff0c;所以要复制多份&#xff08;至少包括Debug和Release两个输出目录&#xff09;&#xff0c;这些做…...

leetCode 2578. 最小和分割 + 排序 + 贪心 + 奇偶分组(构造最优解)

2578. 最小和分割 - 力扣&#xff08;LeetCode&#xff09; 给你一个正整数 num &#xff0c;请你将它分割成两个非负整数 num1 和 num2 &#xff0c;满足&#xff1a; num1 和 num2 直接连起来&#xff0c;得到 num 各数位的一个排列。 换句话说&#xff0c;num1 和 num2 中所…...

自定义实现图片裁剪

要实现这个功能&#xff0c;首先需要创建一个自定义的View&#xff0c;然后在该View中绘制背景框和裁剪后的图片。以下是一个简单的实现&#xff1a; 1. 创建一个名为CustomImageView的自定义View类&#xff0c;继承自View&#xff1a; import android.content.Context; impor…...

LeetCode 找到最终的安全状态题解

LeetCode 找到最终的安全状态题解 题目描述 给定一个有向图&#xff0c;找到所有安全节点。安全节点是永远不会走向环的节点。 示例&#xff1a; 输入&#xff1a;graph [[1,2],[2,3],[5],[0],[5],[],[]]输出&#xff1a;[2,4,5,6] 解题思路 方法&#xff1a;拓扑排序 思路&am…...

CVAT管理员必看:用户权限、任务分割与Datumaro数据导入导出全流程详解

CVAT管理员实战指南&#xff1a;权限配置、任务优化与数据流转全解析 1. 权限管理的艺术&#xff1a;从基础配置到高级控制 在CVAT平台中&#xff0c;权限管理是确保数据安全与协作效率的核心机制。不同于普通标注员视角&#xff0c;管理员需要掌握三个关键权限层级&#xff1a…...

2026 AI低代码实测:原理拆解+主流形态,避坑指南

2026年&#xff0c;AI低代码早已不是“概念炒作”&#xff0c;而是企业数字化转型的核心工具。Gartner预测&#xff0c;2026年全球70%以上新应用将采用低代码/无代码构建&#xff0c;较2023年45%的渗透率实现跨越式增长&#xff1b;IDC数据显示&#xff0c;同期全球AI低代码市场…...

终极指南:3步让苹果触控板在Windows上获得原生级体验

终极指南&#xff1a;3步让苹果触控板在Windows上获得原生级体验 【免费下载链接】mac-precision-touchpad Windows Precision Touchpad Driver Implementation for Apple MacBook / Magic Trackpad 项目地址: https://gitcode.com/gh_mirrors/ma/mac-precision-touchpad …...

NoFences:如何用免费开源方案革命性管理你的Windows桌面分区

NoFences&#xff1a;如何用免费开源方案革命性管理你的Windows桌面分区 【免费下载链接】NoFences &#x1f6a7; Open Source Stardock Fences alternative 项目地址: https://gitcode.com/gh_mirrors/no/NoFences 你是否厌倦了在杂乱无章的Windows桌面上寻找文件&…...

2026年制造业员工入转调离全流程自动化趋势?——从“系统孤岛”到“Agent全闭环”的效能革命

2026年&#xff0c;全球制造业正处于从“设备自动化”向“组织智能化”跨越的关键拐点。 随着人口红利消退与用工结构性矛盾加剧&#xff0c;工厂对于人力资源的精准配置已不仅是行政命题&#xff0c;而是直接影响产线柔性与交付周期的核心生产力命题。 传统的HR管理模式在面对…...

5分钟快速上手Vue FastAPI Admin:现代化前后端分离管理平台完整指南

5分钟快速上手Vue FastAPI Admin&#xff1a;现代化前后端分离管理平台完整指南 【免费下载链接】vue-fastapi-admin ⭐️ 基于 FastAPIVue3Naive UI 的现代化轻量管理平台 A modern and lightweight management platform based on FastAPI, Vue3, and Naive UI. 项目地址: h…...

C盘告急?手把手教你用mklink命令把Fusion 360挪到D盘(Win11保姆级教程)

拯救C盘空间&#xff1a;用符号链接将Fusion 360迁移到D盘的完整指南 当C盘空间告急时&#xff0c;很多用户会发现Fusion 360默认安装在系统盘&#xff0c;占用了大量宝贵空间。本文将详细介绍如何利用Windows的mklink命令&#xff0c;在不影响软件功能的前提下&#xff0c;将F…...

一线大厂AI开发笔记本清单(万元内)

人机协作&#xff0c;AI模型&#xff1a;Deepseek仅供参考一线大厂AI开发笔记本清单&#xff08;万元内&#xff09;机型CPUGPU&#xff08;显存&#xff09;内存SSD散热Linux兼容性风险等级性能星级参考价华硕 天选7 Pro 酷睿版Ultra 9 290HX Plus (24核)RTX 5070 (8GB)32GB1T…...

可持续交通,正在重写“产品生命周期”

作者&#xff1a;王聪彬一边是全球经济对物流、出行和流动效率的持续依赖&#xff0c;一边则是交通运输正在成为全球减碳进程中最难啃的“硬骨头”。过去几十年&#xff0c;交通系统不断推动全球化与城市化加速&#xff0c;但与此同时&#xff0c;它也成为温室气体排放增长最快…...