【專題十七】多源 BFS

📝前言說明:

  • 本專欄主要記錄本人的基礎算法學習以及LeetCode刷題記錄,按專題劃分
  • 每題主要記錄:(1)本人解法 + 本人屎山代碼;(2)優質解法 + 優質代碼;(3)精益求精,更好的解法和獨特的思想(如果有的話)
  • 文章中的理解僅為個人理解。如有錯誤,感謝糾錯

🎬個人簡介:努力學習ing
📋本專欄:C++刷題專欄
📋其他專欄:C語言入門基礎,python入門基礎,C++學習筆記,Linux
🎀CSDN主頁 愚潤澤

你可以點擊下方鏈接,進行該專題內不同子專題的學習

點擊鏈接開始學習
雙指針(1)雙指針(2)
雙指針(3)雙指針(4)
滑動窗口(1)滑動窗口(2)
滑動窗口(3)滑動窗口(4)
二分查找(1)二分查找(2)
前綴和(1)前綴和(2)
前綴和(3)位運算(1)
位運算(2)模擬算法
快速排序歸并排序
鏈表哈希表
字符串
隊列 + 寬搜優先級隊列
BFS 解決 FloodFillBFS 解決最短路徑
多源 BFSBFS 解決拓撲排序

題單匯總鏈接:點擊 → 題單匯總(暫時未整理,因為還沒刷完)

題目

  • 導論——多源 BFS
  • 542. 01 矩陣
    • 優質解
  • 1020. 飛地的數量
    • 個人解
  • 1765. 地圖中的最高點
    • 個人解
  • 1162. 地圖分析
    • 個人解


導論——多源 BFS

多元最短路問題:起始點有多個,去同一個終點

  • 前提:BFS解決的最短路問題都是邊權為 1 的
  • 解法一:把多源最短路問題轉換成若干個單源最短路問題——暴力枚舉每個起點,對每個起點進行單源最短路問題分析【但是時間復雜度高:超時】
  • 解法二:把所有的源點當成一個“超級源點”——從“超級源點”出發,一次單源最短路問題
    • 如何求:“超級源點” ?
    • 把所有的起始節點加入到隊列中,即:第一層由單源的一個節點變成了多源的多個節點(只不過這些節點都屬于第一層罷了)
    • 多個源點可能開辟出不同的路,在不同的路中:后到達的節點會被hash淘汰

542. 01 矩陣

題目鏈接:https://leetcode.cn/problems/01-matrix/description/
在這里插入圖片描述


優質解

思路:

  • 解法一:把 1 當成起點的話,要遍歷整個矩陣
  • 解法二:把 0 當起點:從所有 0 走到某一個 1 的最短距離 == 從 1 走到最近 0 的距離

代碼:

class Solution {
public:vector<vector<int>> updateMatrix(vector<vector<int>>& mat) {int dx[4] = {0, 0, 1, -1};int dy[4] = {1, -1, 0, 0};int m = mat.size(), n = mat[0].size();queue<pair<int, int>> q;vector<vector<int>> dis(m, vector<int>(n, -1));// 先獲得"超級源點"for(int i = 0 ; i < m; i++){for(int j = 0; j < n; j++){if(mat[i][j] == 0){q.push({i, j});dis[i][j] = 0;}}}// 從"超級源點"開始擴展while(q.size()){// int sz = q.size(); 為什么可以不計算 sz ?// 因為之前的 sz 是和 step 配合使用的,我們通過sz知道是在哪一層// 但是現在,下一個dis中填寫的內容可以根據上一個dis中的內容決定// 并且,一定是上一層的節點pop出去以后,才會處理上一層加入的后續節點auto [a, b] = q.front();q.pop();for(int j = 0; j < 4; j++){int x = a + dx[j], y = b + dy[j];if(x >= 0 && x < m && y >= 0 && y < n && dis[x][y] == -1){dis[x][y] = dis[a][b] + 1;q.push({x, y}); }}}return dis;}
};

時間復雜度:O(m?n)O(m*n)O(m?n)
空間復雜度:O(m?n)O(m*n)O(m?n)


1020. 飛地的數量

題目鏈接:https://leetcode.cn/problems/number-of-enclaves/description/
在這里插入圖片描述

個人解

屎山代碼:

class Solution {
public:int numEnclaves(vector<vector<int>>& grid) {// 這就是 floodfill// 只不過從邊緣 1 開始先標記連通塊的時候可以使用 多源 bfs 標記int dx[4] = {0, 0, 1, -1};int dy[4] = {1, -1, 0, 0};int m = grid.size(), n = grid[0].size();queue<pair<int, int>> q;for(int i = 0; i < m; i++){for(int j = 0; j < n; j++){if((i == 0 || i == m - 1 || j == 0 || j == n - 1) && grid[i][j]){grid[i][j] = 0;q.push({i, j});}}}while(q.size()){auto [a, b] = q.front();q.pop();for(int i = 0; i < 4; i++){int x = a + dx[i], y = b + dy[i];if(x >= 0 && x < m && y >= 0 && y < n && grid[x][y]){grid[x][y] = 0;q.push({x, y});}}}int ans = 0;for(int i = 0; i < m; i++){for(int j = 0; j < n; j++){if(grid[i][j])ans++;}}return ans;}
};

時間復雜度:O(m?n)O(m*n)O(m?n)
空間復雜度:O(m?n)O(m*n)O(m?n)


1765. 地圖中的最高點

題目鏈接:https://leetcode.cn/problems/map-of-highest-peak/description/
在這里插入圖片描述

個人解

思路:

  • 和 01 矩陣一樣

屎山代碼:

class Solution {
public:vector<vector<int>> highestPeak(vector<vector<int>>& isWater) {// 自行安排出最高高度// 以水域為起點,能到達的最遠的陸地最高(走最短路徑)int dx[4] = {0, 0, 1, -1};int dy[4] = {1, -1, 0, 0};int m = isWater.size(), n = isWater[0].size();vector<vector<int>> high(m, vector<int>(n, -1));queue<pair<int, int>> q;for(int i = 0; i < m; i++){for(int j = 0; j < n; j++){if(isWater[i][j]){q.push({i, j});high[i][j] = 0;}}}while(q.size()){auto [a, b] = q.front();q.pop();for(int i = 0; i < 4; i++){int x = a + dx[i], y = b + dy[i];if(x >= 0 && x < m && y >= 0 && y < n && high[x][y] == -1){high[x][y] = high[a][b] + 1;q.push({x, y});}}}return high;}
};

時間復雜度:O(m?n)O(m*n)O(m?n)
空間復雜度:O(m?n)O(m*n)O(m?n)


1162. 地圖分析

題目鏈接:https://leetcode.cn/problems/as-far-from-land-as-possible/description/
在這里插入圖片描述

個人解

思路:

// 海洋到最近的陸地的距離 == 陸地到海洋的最短路徑
// 以陸地為起始點做 bfs

用時:14:00
屎山代碼:

class Solution {
public:int maxDistance(vector<vector<int>>& grid) {int dx[4] = {0, 0, 1, -1};int dy[4] = {1, -1, 0, 0};int m = grid.size(), n = grid[0].size();queue<pair<int, int>> q;for(int i = 0; i < m; i++){for(int j = 0; j < n; j++){if(grid[i][j])q.push({i, j});}}int ans = 0;while(q.size()){auto [a, b] = q.front();q.pop();for(int i = 0; i < 4; i++){int x = a + dx[i], y = b + dy[i];if(x >= 0 && x < m && y >= 0 && y < n && !grid[x][y]){grid[x][y] = grid[a][b] + 1;ans = max(ans, grid[x][y]);q.push({x, y});}}}return ans - 1; // 因為第一次是 1 -> 2,但其實是 1}
};

時間復雜度:O(m?n)O(m*n)O(m?n)
空間復雜度:O(m?n)O(m*n)O(m?n)


🌈我的分享也就到此結束啦🌈
要是我的分享也能對你的學習起到幫助,那簡直是太酷啦!
若有不足,還請大家多多指正,我們一起學習交流!
📢公主,王子:點贊👍→收藏?→關注🔍
感謝大家的觀看和支持!祝大家都能得償所愿,天天開心!!!

本文來自互聯網用戶投稿,該文觀點僅代表作者本人,不代表本站立場。本站僅提供信息存儲空間服務,不擁有所有權,不承擔相關法律責任。
如若轉載,請注明出處:http://www.pswp.cn/news/917312.shtml
繁體地址,請注明出處:http://hk.pswp.cn/news/917312.shtml
英文地址,請注明出處:http://en.pswp.cn/news/917312.shtml

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

相關文章

京東零售在智能供應鏈領域的前沿探索與技術實踐

近日&#xff0c;“智匯運河 智算未來”2025人工智能創新創業大會在杭州召開。香港工程科學院院士、香港大學副校長、研究生院院長、講座教授、京東零售供應鏈首席科學家申作軍教授與供應鏈算法團隊技術總監戚永志博士受邀出席并擔任《AI智慧物流與供應鏈分享會》聯席主席&…

MyBatisPlus之CRUD接口(IService與BaseMapper)

MyBatisPlus之CRUD接口—IService與BaseMapper一、BaseMapper與IService的關系二、BaseMapper核心方法詳解2.1 新增操作&#xff08;Insert&#xff09;2.2 查詢操作&#xff08;Select&#xff09;2.3 更新操作&#xff08;Update&#xff09;2.4 刪除操作&#xff08;Delete&…

axios請求的取消

axios請求的取消解決&#xff1a;axios請求的取消解決&#xff1a;axios請求的取消 在使用 Axios 發起請求時&#xff0c;有時候你可能需要取消這些請求&#xff0c;比如當組件銷毀時或者用戶操作導致不再需要獲取之前發起的請求結果。Axios 支持通過 Cancel Token 取消請求。 …

深入理解C++中的Lazy Evaluation:延遲計算的藝術

在編程世界里&#xff0c;“最好的運算就是從未執行的運算” —— 這句話深刻揭示了性能優化的核心思路。如果一個計算過程最終不會被使用&#xff0c;那么提前執行它就是純粹的資源浪費。這種思想衍生出了 Lazy Evaluation&#xff08;緩式評估&#xff09; 技術&#xff1a;延…

php完整處理word中表單數據的方法

使用php基礎方式實現word中表單處理<?php/*** zipFile 類用于處理 .docx 文件的解壓、修改和重新打包*/ class zipFile {/** var ZipArchive ZIP 文件對象 */private $zipFile;/** var string 臨時目錄路徑 */private $tempDir;/** var string 嵌入的 Excel 文件臨時目錄路…

Node.js 操作 MongoDB

目錄 Node.js 操作 MongoDB 一、什么是 MongoDB&#xff1f; 二、MongoDB 的功能概覽 三、MongoDB 的安裝與啟動 安裝 MongoDB&#xff08;以本地安裝為例&#xff09; 啟動 MongoDB 四、Node.js 如何連接 MongoDB&#xff1f; 使用 Mongoose ODM 工具 建立連接 五、…

先學Python還是c++?

選擇先學Python還是C&#xff0c;取決于你的學習目標、應用場景和職業規劃。以下是兩者的對比分析和建議&#xff0c;幫助你做出更適合自己的選擇&#xff1a;一、核心差異對比維度PythonC學習曲線簡單易上手&#xff08;語法接近自然語言&#xff09;復雜&#xff08;需理解指…

Trae + Notion MCP:將你的Notion數據庫升級為智能對話機器人

前言 Notion作為一款功能強大的信息管理工具&#xff0c;被廣泛用于項目跟蹤、知識庫構建和數據整理。然而&#xff0c;隨著數據量的增長&#xff0c;我們常常會發現自己陷入了重復和繁瑣的操作中。比如&#xff0c;為了找到符合特定條件的幾條數據&#xff0c;需要在龐大的數…

【iOS】retain/release底層實現原理

文章目錄前言前情知識retain和release的實現原理&#xff08;MRC手動管理&#xff09;retain&#xff08;MRC手動管理&#xff09;retain源碼內聯函數rootRetain源碼相關的sidetable_tryRetain()方法retain底層工作流程總結releaserelease源碼內聯函數rootRelease源碼小結前言 …

文件同步神器-rsync命令講解

rsync 是一個強大的文件同步與傳輸工具&#xff0c;廣泛用于本地或遠程服務器之間的高效文件備份、鏡像或同步。其核心優勢是通過增量傳輸?&#xff08;僅傳輸文件差異部分&#xff09;和壓縮減少數據傳輸量&#xff0c;同時支持保留文件元數據&#xff08;如權限、時間戳、所…

Rust: 工具鏈版本更新

遇到 cargo build --release 錯誤&#xff0c;比如&#xff0c;當前 Rust 工具鏈版本&#xff08;1.78.0&#xff09;低于依賴項所需的最低版本&#xff08;部分依賴要求 ≥1.82.0&#xff09;。以下是系統化的解決方案&#xff1a; &#x1f527; 一、升級 Rust 工具鏈&#x…

Prompt-to-Prompt| 修改Attention會有“反向傳播”或梯度計算?

需要注意的幾個問題&#xff1a;額外計算開銷&#xff1a;Cross-Attention Control原因&#xff1a;Prompt-to-Prompt的編輯方法需要動態干預交叉注意力&#xff08;Cross-Attention&#xff09;層的權重&#xff0c;這會引入額外的計算和顯存占用&#xff1a;需要緩存注意力矩…

電商API接口的優勢、數據采集方法及功能說明

一、電商API接口的核心優勢1. 高效性與準確性數據采集效率&#xff1a;API通過標準化參數&#xff08;如商品ID、類目&#xff09;直接獲取結構化數據&#xff08;JSON/XML&#xff09;&#xff0c;無需解析HTML&#xff0c;減少誤差。例如&#xff0c;采集1000條商品信息&…

iOS企業簽名掉簽,iOS企業簽名掉簽了怎么辦?

不能上架到App Store的iOS應用 &#xff0c;幾乎每一個開發者的選擇都是通過iOS簽名這種內測渠道來完成APP的上架任務&#xff0c;最常用的就是企業簽名、超級簽名以及TF上架&#xff0c;其中最受歡迎的當屬于企業簽名了。不過企業簽名會出現掉簽的現象&#xff0c;那么企業簽名…

存儲成本深度優化:冷熱分層與生命周期管理——從視頻平臺年省200萬實踐解析智能存儲架構

一、冷熱分層&#xff1a;存儲成本優化的核心邏輯1.1 數據訪問的“二八定律”據行業統計&#xff0c;80%的訪問集中在20%的熱數據上&#xff0c;而超過90天的歷史數據訪問頻率下降70%以上。某視頻平臺存儲超10PB媒體文件&#xff0c;未分層前年存儲成本高達680萬元&#xff0c;…

Java設計模式之《備忘錄模式》

目錄 1. 概念 1.1、定義 1.2、適用場景 2、角色劃分 3、實現 1、Originator&#xff08;發起人&#xff09; 2、Memento&#xff08;備忘錄&#xff09; 3、Caretaker&#xff08;管理者&#xff09; 4、使用示例 4、優缺點 4.1、優點 4.2、缺點 前言 備忘錄模式是…

SpringBoot 多環境配置

在實際項目開發中&#xff0c;不同環境往往有不同的配置需求&#xff1a; 開發環境&#xff08;dev&#xff09;&#xff1a;本地調試&#xff0c;連接測試數據庫&#xff1b;測試環境&#xff08;test&#xff09;&#xff1a;接口聯調&#xff0c;接近真實場景&#xff1b;生…

延凡智慧醫院數字孿生平臺

延凡智慧醫院數字孿生平臺是延凡科技依托物聯網、數字孿生、AI 算法及邊緣計算技術打造的醫療場景全要素數字化解決方案&#xff0c;通過構建醫院物理實體與虛擬空間的實時映射&#xff0c;實現醫療資源優化、運營效率提升及患者體驗升級。一、平臺價值&#xff08;一&#xff…

談談WebAssembly、PWA、Web Workers的作用和場景

WebAssembly、PWA 和 Web Workers 是現代 Web 開發中提升性能、擴展能力的重要技術&#xff0c;各自解決不同場景的問題&#xff0c;以下結合實際使用經驗分析&#xff1a;一、WebAssembly&#xff08;Wasm&#xff09;&#xff1a;高性能代碼執行作用&#xff1a;WebAssembly …

嵌入式第十八課!!數據結構篇入門及單向鏈表

在前幾章對C語言的學習中&#xff0c;我們學到了&#xff1a;基本的C語法和簡單算法面向過程的編程思想而在數據結構這一篇章&#xff0c;我們將要學習&#xff1a;常用的數據存儲結構算法面向對象的編程思想數據結構在正式開始學習之前&#xff0c;我們先來了解一下什么是數據…