2025年- G27-Lc101-542. 01 矩阵--java版

1.题目描述

在这里插入图片描述

在这里插入图片描述

2.思路

在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述

总结:用广度优先搜索,首先要确定0的位置,不为0的位置,我们要更新的它的值,只能往上下左右寻找跟它最近的0的位置。
解题思路
我们用 BFS(广度优先搜索)求解,因为 BFS 可以保证最短路径。计算出每个 1 到最近的 0 的最短距离。

步骤:

初始化队列

先找到所有的 0,把它们的坐标 (i, j) 放入队列 queue,并初始化 dist[i][j] = 0。

其他的 1 先标记为 -1,表示未计算。

BFS 计算最短距离

每次从 queue 取出一个 (i, j) 位置的 0,尝试向 四个方向(上、下、左、右)扩展:

如果新位置是 -1(未计算),就更新它的 dist 值 = 当前值 +1,然后把它加入 queue 继续处理。

在这里插入图片描述

在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
BFS 遍历所有 1,把 -1 变成最短距离,直到 队列为空。⚡ 结束条件:

队列 queue 为空时,所有 1 都已经更新,算法结束。✅ 先把 0 入队,1 变 -1
✅ 从 0 开始 BFS,层层扩展
✅ BFS 遍历完所有 1,队列为空时结束

这样,最终矩阵每个 1 的值就是它到最近 0 的最短距离!
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
例子1:

在这里插入图片描述

在这里插入图片描述

在这里插入图片描述

个人总结:0值保持不变,1值赋值为-1.从0的位置出发,上下左右扫描,遇到-1,将距离更新为1并且赋值给当前遇到的元素。从当前元素(比如1)出发遇到值为-1的继续更新,并把此时距离2赋值给当前遇到的-1.以此类推,从当前元素(比如2)出发,遇到值为-1的值再次更新,并把此时距离=3赋值给遇到的-1.
在这里插入图片描述

例子2:

在这里插入图片描述
在这里插入图片描述
在这里插入图片描述

在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述

在这里插入图片描述

在这里插入图片描述在这里插入图片描述
在这里插入图片描述

在这里插入图片描述

在这里插入图片描述

3.代码实现

方法一:

class Solution {public int[][] updateMatrix(int[][] mat) {int m = mat.length;//计算初始二维数组的行数int n = mat[0].length;//计算初始二维数组的列数int[][] dist = new int[m][n];//定义一个队列Queue<int[]> s1 = new LinkedList<>();//LinkedList<>(常用,支持 FIFO 队列)// 1. 初始化:找到所有 0,设定距离,1 设为 -1for (int i = 0; i < m; i++) {for (int j = 0; j < n; j++) {if (mat[i][j] == 0) {dist[i][j] = 0;s1.offer(new int[]{i, j});//new int[]{i, j} 这里是 一维数组,它的作用是将 (i, j) 这个坐标存入队列。} else {dist[i][j] = -1;}}}// 2.方向数组(上、下、左、右)int[][] directions = {{0, -1}, {0, 1}, {1, 0}, {-1, 0}};// 2. BFS 遍历所有 1,更新最近 0 的距离while (!s1.isEmpty()) {//队列 queue 是 Queue<int[]>,即存储的是一维数组 int[],每个 int[] 代表一个坐标点 (x, y)。//queue.poll() 返回的是 queue 里存储的 int[] 数组,它的结构是 [x, y],即一个一维数组,包含两个整数(行号 x 和列号 y)。int[] curr = s1.poll();//存储当前坐标的一维数组,长度为 2 的一维数组。//for (int i = 0; i < directions.length; i++) {//    int dx = directions[i][0];//    int dy = directions[i][1];////    int newX = x + dx;//    int newY = y + dy;//}for (int[] dir : directions) {// dir = {-1, 0},dir = {1, 0},{1,0},{-1,0}int newX = curr[0] + dir[0];int newY = curr[1] + dir[1];if (newX >= 0 && newX < m && newY >= 0 && newY < n && dist[newX][newY] == -1) {//dist[newX][newY]==-1,说明刚开始0的元素附近为1的元素把他们设置为-1,dist[newX][newY]为0附近的元素dist[newX][newY]=dist[curr[0]][curr[1]]+1;s1.offer(new int[]{newX,newY});}}}return dist;// 检查边界 & 是否未计算}
}

带测试方法:

import java.util.LinkedList;
import java.util.Queue;public class test05 {public int[][] updateMatrix(int[][] mat) {int m = mat.length;//计算初始二维数组的行数int n = mat[0].length;//计算初始二维数组的列数int[][] dist = new int[m][n];//定义一个队列Queue<int[]> s1 = new LinkedList<>();//LinkedList<>(常用,支持 FIFO 队列)// 1. 初始化:找到所有 0,设定距离,1 设为 -1for (int i = 0; i < m; i++) {for (int j = 0; j < n; j++) {if (mat[i][j] == 0) {dist[i][j] = 0;s1.offer(new int[]{i, j});//new int[]{i, j} 这里是 一维数组,它的作用是将 (i, j) 这个坐标存入队列。} else {dist[i][j] = -1;}}}// 2.方向数组(上、下、左、右)int[][] directions = {{0, -1}, {0, 1}, {1, 0}, {-1, 0}};// 2. BFS 遍历所有 1,更新最近 0 的距离while (!s1.isEmpty()) {//队列 queue 是 Queue<int[]>,即存储的是一维数组 int[],每个 int[] 代表一个坐标点 (x, y)。//queue.poll() 返回的是 queue 里存储的 int[] 数组,它的结构是 [x, y],即一个一维数组,包含两个整数(行号 x 和列号 y)。int[] curr = s1.poll();//存储当前坐标的一维数组,长度为 2 的一维数组。//for (int i = 0; i < directions.length; i++) {//    int dx = directions[i][0];//    int dy = directions[i][1];////    int newX = x + dx;//    int newY = y + dy;//}for (int[] dir : directions) {// dir = {-1, 0},dir = {1, 0},{1,0},{-1,0}int newX = curr[0] + dir[0];int newY = curr[1] + dir[1];if (newX >= 0 && newX < m && newY >= 0 && newY < n && dist[newX][newY] == -1) {//dist[newX][newY]==-1,说明刚开始0的元素附近为1的元素把他们设置为-1,dist[newX][newY]为0附近的元素dist[newX][newY]=dist[curr[0]][curr[1]]+1;s1.offer(new int[]{newX,newY});}}}return dist;// 检查边界 & 是否未计算}public static void main(String[] args){test05 solution = new test05();int[][] mat={{0, 0, 0},{0, 1, 0},{1, 1, 1}};int[][] reasult= solution.updateMatrix(mat);for(int[] row:reasult){for(int num:row){System.out.print(num+" ");}System.out.println();}}}

关键代码:

// 2. BFS 遍历while (!queue.isEmpty()) {int[] cell = queue.poll();int x = cell[0], y = cell[1];for (int[] dir : directions) {int newX = x + dir[0];int newY = y + dir[1];// 检查边界 & 是否未访问if (newX >= 0 && newX < m && newY >= 0 && newY < n && dist[newX][newY] == -1) {dist[newX][newY] = dist[x][y] + 1; // 正确更新距离queue.offer(new int[]{newX, newY}); // 加入队列}}}

补充队列的offer和poll用法
queue.offer()和queue.poll()的用法

import java.util.LinkedList;
import java.util.Queue;public class QueueExample {public static void main(String[] args) {// 创建一个队列(FIFO:先进先出)Queue<Integer> queue = new LinkedList<>();// 向队列中添加元素queue.offer(10);queue.offer(20);queue.offer(30);System.out.println("队列内容:" + queue); // [10, 20, 30]// 取出队列头部元素(不删除)System.out.println("队头元素:" + queue.peek()); // 10// 取出并删除队列头部元素System.out.println("出队元素:" + queue.poll()); // 10System.out.println("队列内容:" + queue); // [20, 30]}
}
import java.util.PriorityQueue;
import java.util.Queue;public class PriorityQueueExample {public static void main(String[] args) {Queue<Integer> pq = new PriorityQueue<>();// 添加元素pq.offer(30);pq.offer(10);pq.offer(20);System.out.println("队列内容:" + pq); // [10, 30, 20] (内部最小堆)// 取出最小的元素(自动排序)System.out.println("出队元素:" + pq.poll()); // 10System.out.println("出队元素:" + pq.poll()); // 20//queue.poll() 与 remove() 类似,但 remove() 队列为空时会抛异常。}
}

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

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

相关文章

CANopen基本理论

目录 一、CANopen简介 二、OD对象字典 2.1 OD对象字典简介 2.2 CANopen预定义连接集 三、PDO过程数据对象 四、SDO过程数据对象 五、特殊协议 5.1 同步协议 5.2 时间戳协议 5.3 紧急报文协议 六、NMT网络管理 6.1 NMT节点状态 6.2 NMT节点上线报文 6.3 NMT心跳报…

【Zookeeper搭建】Zookeeper分布式集群搭建完整指南

Zookeeper分布式集群搭建 &#xff08;一&#xff09;克隆前准备工作 一、时钟同步 步骤&#xff1a; 1、输入date命令可以查看当前系统时间&#xff0c;可以看到此时系统时间为PDT&#xff08;部分机器或许为EST&#xff09;&#xff0c;并非中国标准时间。我们在中国地区…

MVC基础概念及相应代码示例

&#xff08;旧的&#xff09;代码实现方法 一个功能模块的代码逻辑&#xff08;显示处理&#xff0c;数据处理&#xff0c;逻辑判定&#xff09;都写在一起(耦合) &#xff08;新的&#xff09;代码MVC分层实现方法 显示部分实现&#xff08;View视图&#xff09; 数据处理实…

nginx优化(持续更新!!!)

1.调整文件描述符 # 查看当前系统文件描述符限制 ulimit -n# 永久修改文件描述符限制 # 编辑 /etc/security/limits.conf 文件&#xff0c;添加以下内容 * soft nofile 65535 * hard nofile 65535# 编辑 /etc/sysctl.conf 文件&#xff0c;添加以下内容 fs.file-max 655352.调…

apache连接池机制讨论

apache连接池的连接有效性 server一般会配置keep-alive超时时间&#xff0c;过了这个时间还没新请求到来&#xff0c;则关闭连接。客户端从连接池里拿出连接时&#xff0c;会检查一下连接是否已关闭&#xff0c;如已关闭&#xff0c;会丢弃掉该连接&#xff0c;并尝试从连接池…

【QT5 多线程示例】条件变量

文章目录 条件变量使用 wakeOne()使用 wakeAll() 条件变量 QT的条件变量类是QWaitCondition&#xff0c;有wakeOne() 和 wakeAll() 两个方法 wakeOne()&#xff1a;仅唤醒一个等待的线程。wakeAll()&#xff1a;唤醒所有等待的线程。 使用 wakeOne() https://github.com/Bi…

备赛蓝桥杯之第十六届模拟赛第1期职业院校组第四题:世纪危机(人口增长推算)

提示&#xff1a;本篇文章仅仅是作者自己目前在备赛蓝桥杯中&#xff0c;自己学习与刷题的学习笔记&#xff0c;写的不好&#xff0c;欢迎大家批评与建议 由于个别题目代码量与题目量偏大&#xff0c;请大家自己去蓝桥杯官网【连接高校和企业 - 蓝桥云课】去寻找原题&#xff0…

从零构建大语言模型全栈开发指南:第三部分:训练与优化技术-3.2.3预训练任务设计:掩码语言建模(MLM)与下一句预测(NSP)

👉 点击关注不迷路 👉 点击关注不迷路 👉 点击关注不迷路 文章大纲 3.2.3 预训练任务设计:`掩码语言建模(MLM)`与下一句预测(NSP)1. 掩码语言建模(`Masked Language Modeling, MLM`)1.1 MLM的核心原理与数学形式1.2 高级掩码优化技术1.2.1 `Span Masking(SpanBER…

OpenBMC:BmcWeb 生效路由2 Trie字典树

OpenBMC:BmcWeb 生效路由1 基于method分类路由_openbmc web-CSDN博客 可以看到,在internalAdd中: std::vector<BaseRule*> rules; rules.emplace_back(ruleObject); trie.add(rule, static_cast<unsigned>(rules.size() - 1U)); ruleObject首先被放入了每个meth…

Appium中元素定位之一组元素定位API

应用场景 和定位一个元素相同&#xff0c;但如果想要批量的获取某个相同特征的元素&#xff0c;使用定位一组元素的方式更加方便 在 Appium 中定位一组元素的 API 与定位单个元素的 API 类似&#xff0c;但它们返回的是一个元素列表&#xff08;List<MobileElement>&am…

第五周日志-重新学汇编(2)

机器语言 汇编语言(直接在硬件上工作——硬件系统结构&#xff09;&#xff1a; 1.机器语言 每一种微处理器硬件设计和内部结构不同&#xff08;决定了电信号不同&#xff0c;进而需要不同的机器指令&#xff09; #早期通过纸带机/卡片机输入计算机&#xff0c;进行运算 2…

【9】Strongswan collections —— enumerator

//以目录枚举为例子&#xff0c;说明enumerator&#xff0c;从源码剥离可运行 #include <stdio.h> #include <stdbool.h> #include <dirent.h> #include <errno.h> #include <string.h> #include <sys/types.h> #include <sys/stat.h&…

谈谈对spring IOC的理解,原理和实现

一、IoC 核心概念 1. 控制反转&#xff08;Inversion of Control&#xff09; 传统编程中对象自行管理依赖&#xff08;主动创建&#xff09;&#xff0c;而IoC将控制权转移给容器&#xff0c;由容器负责对象的创建、装配和管理&#xff0c;实现依赖关系的反向控制。 2. 依赖…

【Hugging Face 开源库】Diffusers 库 —— 扩散模型

Diffusers 的三个主要组件1. DiffusionPipeline&#xff1a;端到端推理工具__call__ 函数callback_on_step_end 管道回调函数 2. 预训练模型架构和模块UNetVAE&#xff08;Variational AutoEncoder&#xff09;图像尺寸与 UNet 和 VAE 的关系EMA&#xff08;Exponential Moving…

甘肃旅游服务平台+论文源码视频演示

4 系统设计 4.1系统概要设计 甘肃旅游服务平台并没有使用C/S结构&#xff0c;而是基于网络浏览器的方式去访问服务器&#xff0c;进而获取需要的数据信息&#xff0c;这种依靠浏览器进行数据访问的模式就是现在用得比较广泛的适用于广域网并且没有网速限制要求的小程序结构&am…

路由选型终极对决:直连/静态/动态三大类型+华为华三思科配置差异,一张表彻底讲透!

路由选型终极对决&#xff1a;直连/静态/动态三大类型华为华三思科配置差异&#xff0c;一张表彻底讲透&#xff01; 一、路由&#xff1a;互联网世界的导航系统二、路由类型深度解析三者的本质区别 三、 解密路由表——网络设备的GPS华为&#xff08;Huawei&#xff09;华三&a…

【RAG综述系列】之 RAG 相关背景和基本原理

系列文章&#xff1a; 【RAG综述系列】之 RAG 相关背景和基本原理 【RAG综述系列】之 RAG 特点与挑战以及方法与评估 【RAG综述系列】之 RAG 先进方法与综合评估 【RAG综述系列】之 RAG 应用和未来方向 正文&#xff1a; 检索增强生成&#xff08;Retrieval-Augmented Gen…

CMake 构建的Qt 项目中的构建套件的配置

在Qt 框架中&#xff0c;使用CMake 构建工具时&#xff0c;需要自己给构建套件添加相关配置&#xff0c;否则已经添加的构建套件将不可选择使用。 创建CMake 项目后&#xff0c;如果打开项目配置时&#xff0c;出现如下构建套件不可选的情况&#xff0c; 需要先确认是否安装…

本地化智能运维助手:基于 LangChain 数据增强 和 DeepSeek-R1 的K8s运维文档检索与问答系统 Demo

写在前面 博文内容为基于 LangChain 数据增强 和 Ollams 本地部署 DeepSeek-R1实现 K8s运维文档检索与问答系统 Demo通过 Demo 对 LEDVR 工作流&#xff0c; 语义检索有基本认知理解不足小伙伴帮忙指正 &#x1f603;,生活加油 我看远山&#xff0c;远山悲悯 持续分享技术干货…

Kotlin when 表达式完全指南:从基础到高级的12种实战用法

掌握 when 的灵活运用&#xff0c;告别繁琐的 if-else 链 以下是 Kotlin 中 when 表达式的 12种核心用法 的全面总结&#xff0c;涵盖基础到高级场景&#xff0c;并附带实用示例&#xff1a; 一、基础用法 1. 替代 Java 的 switch-case when (x) {1 -> println("一&qu…