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?中至少有一個?0?

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.pswp.cn/web/94493.shtml
繁體地址,請注明出處:http://hk.pswp.cn/web/94493.shtml
英文地址,請注明出處:http://en.pswp.cn/web/94493.shtml

如若內容造成侵權/違法違規/事實不符,請聯系多彩編程網進行投訴反饋email:809451989@qq.com,一經查實,立即刪除!

相關文章

Elasticsearch如何確保數據一致性?

Elasticsearch 通過多種機制確保數據在分布式環境中的一致性&#xff0c;但由于其分布式和近實時&#xff08;Near Real-Time, NRT&#xff09;的特性&#xff0c;它提供的是最終一致性&#xff08;Eventual Consistency&#xff09;&#xff0c;而非強一致性。以下是核心機制和…

2026畢設選題-大數據-基于 Spring Boot的化妝品推薦系統的設計與實現

技術范圍&#xff1a;大數據、物聯網、SpringBoot、Vue、SSM、HLMT、小程序、PHP、Nodejs、Python、爬蟲、數據可視化、安卓App、機器學習等設計與開發。 主要內容&#xff1a;功能設計、開題報告、任務書、中期檢查PPT、系統功能實現、代碼編寫、論文編寫和輔導、論文降重、長…

數據結構算法:順序表

數據結構&#xff1a;順序表一.寄包柜1.題目如何創建數組&#xff1f;1. 需求本質2. 傳統靜態數組的缺陷3. 動態方案&#xff1a;向量的數組4. 核心邏輯5. 關鍵優勢總結2.解題思路2.1題目分析2.2具體解題邏輯拆解步驟2.3總結2.4參考代碼二.移動零1.題目2.解題思路2.1**解題核心…

IIS 安裝了.netcore運行時 還是報錯 HTTP 錯誤 500.19

IIS 安裝了.netcore運行時 還是報錯 HTTP 錯誤 500.19 - Internal Server Error 錯誤代碼 0x8007000d 我甚至是先安裝的SDK&#xff0c;再安裝的運行時runtime的安裝包&#xff0c;都不行。 而且在IIS的模塊中&#xff0c;找不到 AspNetCoreModuleV2。 最后在微軟官網n…

Flink 滑動窗口實戰:從 KeyedProcessFunction 到 AggregateFunction WindowFunction 的完整旅程

一、業務背景 我們要在 Flink 實時流上統計 每個用戶-品牌組合最近 1 小時的最晚行為時間&#xff0c;并且每 5 分鐘更新一次結果。 數據來自 Kafka&#xff0c;事件類型為 CartEvent&#xff1a; public class CartEvent {public String userId;public String brandId;public …

Kubernetes“城市規劃”指南:告別資源擁堵與預算超支,打造高效云原生都市

導讀&#xff1a; 如果把你的Kubernetes集群想象成一座拔地而起的現代化大都市&#xff0c;那么你&#xff0c;平臺工程師&#xff0c;就是這座城市的首席規劃師。然而&#xff0c;為何我們精心打造的許多“云原生都市”正迅速陷入交通擁堵、資源閑置和預算超支的困境&#xff…

2.4 Flink運行時架構:Task、SubTask、ExecutionGraph的關系

在理解Flink運行時架構之前&#xff0c;我們先用一個生活化的比喻來建立直觀認識&#xff1a; 想象你是一家大型工廠的總經理&#xff0c;需要生產一批復雜的產品。你會怎么做&#xff1f; 制定生產計劃&#xff1a;首先畫出生產流程圖&#xff0c;明確每個環節的工作內容分解任…

`mysql_query()` 數據庫查詢函數

1) 函數的概念與用途 mysql_query() 是 MySQL C API 中的核心函數&#xff0c;用于向 MySQL 服務器發送 SQL 查詢語句。這個函數充當了 C/C 應用程序與 MySQL 數據庫之間的橋梁&#xff0c;允許程序執行各種數據庫操作。 可以將 mysql_query() 想象成一個"數據庫信使"…

[系統架構設計師]通信系統架構設計理論與實踐(十七)

[系統架構設計師]通信系統架構設計理論與實踐&#xff08;十七&#xff09; 一.通信系統網絡架構 形式: 局域網&#xff0c;廣域網&#xff0c;移動通信網 1.局域網網絡架構 單一機構專用計算機的網絡 組成&#xff1a;計算機&#xff0c;交換機&#xff0c;路由器 特點&#x…

【趙渝強老師】Docker的私有鏡像倉庫:Harbor

Harbor是由VMware公司開發并開源的企業級的Docker鏡像倉庫的管理項目&#xff0c;它包括鏡像的權限管理&#xff08;RBAC&#xff09;、目錄訪問&#xff08;LDAP&#xff09;、日志審核、管理界面、自我注冊、鏡像復制和中文支持等功能。 視頻講解如下 【趙渝強老師】Docker的…

【QT/C++】實例理解類間的六大關系之泛化關系(Generalization)

【QT/C】實例理解類間的六大關系之泛化關系&#xff08;Generalization&#xff09; 在前面章節一文完美概括UML類圖及其符號&#xff08;超詳細介紹&#xff09;中已經對泛化關系的概念進行了總結&#xff0c;本文我將用實際案例來進一步理解泛化關系&#xff0c;以便應對未來…

【微服務的數據一致性分發問題】究極解決方案

文章目錄一、微服務數據分發1、簡介2、典型場景&#xff08;1&#xff09;跨服務業務流程協同&#xff08;2&#xff09;數據副本同步&#xff08;讀寫分離&#xff09;&#xff08;3&#xff09;實時狀態通知&#xff08;4&#xff09;數據聚合與統計分析&#xff08;5&#x…

挖幣與區塊鏈技術有怎樣的聯系?

挖幣&#xff08;通常指加密貨幣挖礦&#xff09;與區塊鏈技術有著緊密的聯系&#xff0c;挖礦是區塊鏈網絡維持運行和安全的重要機制之一&#xff0c;具體聯系如下&#xff1a;1. 挖礦是區塊鏈共識機制的核心環節區塊鏈通過“共識機制”確保全網節點對交易記錄達成一致&#x…

C數據結構:二叉樹(下)

C數據結構&#xff1a;二叉樹&#xff08;下&#xff09; 1.二叉樹遞歸結構遍歷 2.例題 3.二叉樹的性質 1.二叉樹遞歸結構遍歷 我們先創建一個如下圖所示的二叉樹。typedef int BTDataType; typedef struct BinaryTreeNode {BTDataType data;struct BinaryTreeNode* left;struc…

Linux系統的網絡管理(一)

一、網絡參數配置&#xff1a;搭建穩定網絡基礎網絡參數配置是 Linux 網絡管理的起點&#xff0c;根據操作方式可分為圖形化配置、命令行配置和配置文件配置&#xff0c;不同方式適用于不同場景&#xff08;臨時調試 / 永久生效&#xff09;。1. 圖形化配置&#xff1a;依賴 Ne…

Web程序設計

一、控件基礎 文本框、按鈕事件的使用 <% Page Language"C#" AutoEventWireup"true" CodeFile"User_Login.aspx.cs" Inherits"User_Login" %><!DOCTYPE html><html xmlns"http://www.w3.org/1999/xhtml"&g…

復合設計模式

復合設計模式復合設計模式是一種結構模式&#xff0c;可讓您統一處理單個對象和對象的組合。它允許您構建樹狀結構&#xff08;例如&#xff0c;文件系統、UI 層次結構、組織結構&#xff09;&#xff0c;客戶端可以使用同一界面處理單個元素和元素組。它在以下情況下特別有用&…

使用 Prometheus 監控服務器節點:Node Exporter 詳解與配置

前言 在上一篇文章中&#xff0c;我們介紹了如何在 CentOS 上部署 Prometheus 并使用 systemd 進行管理。本文將繼續深入&#xff0c;講解如何使用 Prometheus 監控服務器節點&#xff0c;重點介紹 Node Exporter 的作用、安裝和配置方法。 Node Exporter 是 Prometheus 生態…

C# 編寫一個XmlToDota的轉換工具

以下代碼可以將Labelme標注的旋轉框Xml格式文件轉換為Yolo標注格式的txt文件&#xff0c;以便用Yolo OBB訓練自己的數據集&#xff1a;using System; using System.Collections.Generic; using System.IO; using System.Xml; using System.Linq; using System.Globalization;na…

[Android] 人體細胞模擬器1.5

[Android] 人體細胞模擬器1.5 鏈接&#xff1a;https://pan.xunlei.com/s/VOYVUieTpjNVJq-bMys4EEDGA1?pwdm7m6# 省流:這個軟件的開發者有點逆天&#xff0c;一個模擬人體器官的軟件&#xff0c;細致到有血液報告&#xff0c;還縫合了生理學和病理學&#xff0c;甚至還能做切…