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

LeetCode-542. 01 矩阵

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 中至少有一个 

2、代码

#include <queue>    
#include <utility>  
#include <vector>   
using namespace std;class Solution
{public:// 计算矩阵中每个元素到最近0的距离vector<vector<int>> updateMatrix(vector<vector<int>>& mat){int row = mat.size();     int col = mat[0].size();  vector<vector<int>> ret(row, vector<int>(col, -1));// BFS队列,用于存储待处理的坐标(宽搜的核心数据结构)queue<pair<int, int>> q;// 第一步:初始化所有0的位置for (int i = 0; i < row; ++i) {for (int j = 0; j < col; ++j) {if (mat[i][j] == 0) {ret[i][j] = 0;   // 0到自身的距离为0q.push({i, j});  // 将所有0的坐标加入队列,作为BFS的起点}}}// 定义四个方向的偏移量:上、下、左、右(用于遍历相邻单元格)vector<pair<int, int>> dirs = {{-1, 0},{1, 0},  {0, -1},{0, 1}};  // 第二步:多源BFS扩散计算距离while (!q.empty()) {// 取出队列头部的坐标(当前处理的单元格)auto [i, j] = q.front();// 遍历四个相邻方向for (auto [x, y] : dirs) {// 计算相邻单元格的坐标int dx = i + x;  // 新行坐标 = 当前行 + 方向偏移int dy = j + y;  // 新列坐标 = 当前列 + 方向偏移// 检查相邻单元格是否有效:// 1. 不超出矩阵边界(行和列都在有效范围内)// 2. 该位置尚未计算距离(ret[dx][dy] == -1)if ((dx >= 0 && dx < row) && (dy >= 0 && dy < col) &&(ret[dx][dy] == -1)) {// 相邻单元格的距离 = 当前单元格距离 + 1(因为相邻)ret[dx][dy] = ret[i][j] + 1;// 将新计算的单元格加入队列,用于后续扩散q.push({dx, dy});}}// 处理完当前单元格后出队q.pop();}// 返回计算好的距离矩阵return ret;}
};

3、解题思路

  1. 初始化部分:通过双重循环找到所有 0 的位置,将其距离设为 0 并加入队列,作为 BFS 的多源起点。
  2. 方向数组:定义了上下左右四个方向的偏移量,避免了重复编写判断相邻单元格的代码。
  3. BFS 核心逻辑
    • 从队列中取出当前单元格,遍历其四个相邻位置
    • 对每个有效且未计算距离的相邻单元格,更新其距离(当前距离 + 1)并加入队列
    • 保证每个单元格只被计算一次,且首次计算的距离就是到最近 0 的最短距离
  4. 为什么有效:同时将所有 0 作为起点(距离为 0) 从 0 开始向外扩散,每个 1 被首次访问时,一定是被最近的 0所扩散到的,因此首次计算的距离就是最短距离
http://www.dtcms.com/a/348067.html

相关文章:

  • (LeetCode 每日一题) 1493. 删掉一个元素以后全为 1 的最长子数组 (双指针)
  • 03-鸿蒙架构与编程模型
  • ChainVault:重塑亚洲黄金交易基建,引领RWA金融新浪潮
  • Java 22 新特性及具体应用
  • week4-[字符数组]英语作文
  • Games101 作业1 旋转与投影
  • 量子链(Qtum)分布式治理协议
  • Qt+windows+QtInstallerFramework打包可执行文件教程-美观且简单
  • Django的Serializers与 fastapi 的Pydantic
  • Excel 转化成JSON
  • Java:LinkedList的使用
  • Django的Settings 配置文件详解
  • 【ArcGIS Pro 全攻略】GIS 数据格式终极指南:从原理到实战,再也不纠结选哪种格式!
  • React useState 全面深入解析
  • Linux 824 shell:expect
  • 基于5G NR NTN与DVB-S2X/RCS2的机载卫星通信终端性能分析
  • 低功耗模式DMA数据搬运问题解析
  • 在测试接入抖音小游戏订阅消息推送时遇到的问题
  • bun + vite7 的结合,孕育的 Robot Admin 【靓仔出道】(十八)
  • K8s部署MySQL8.0数据库
  • Transformer实战(13)——从零开始训练GPT-2语言模型
  • 【go语言】字符串函数
  • imx6ull-驱动开发篇39——Linux INPUT 子系统实验
  • 05-ArkUI界面开发
  • Solidity学习笔记
  • ZKmall模块商城的推荐数据体系:从多维度采集到高效存储的实践
  • 用 Bright Data MCP Server 构建实时数据驱动的 AI 情报系统:从市场调研到技术追踪的自动化实战
  • 青少年软件编程(python五级)等级考试试卷-客观题(2024年6月)
  • 数据库原理及应用_数据库基础_第2章关系数据库标准语言SQL_数据的维护
  • Adobe CS6所有系列绿色免安装版,Photoshop 6 Adobe Illustrator CS6 等绿色版