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