BFS算法篇——從晨曦到星辰,BFS算法在多源最短路徑問題中的詩意航行(下)

文章目錄

  • 引言
  • 一、01矩陣
    • 1.1 題目鏈接:https://leetcode.cn/problems/01-matrix/description/
    • 1.2 題目分析:
    • 1.3 思路講解:
    • 1.4 代碼實現:
  • 二、飛地的數量
    • 2.1 題目鏈接:https://leetcode.cn/problems/number-of-enclaves/description/
    • 2.2 題目分析:
    • 2.3 思路講解:
    • 2.4 代碼實現:
  • 三、地圖中的最高點
    • 3.1 題目鏈接:https://leetcode.cn/problems/map-of-highest-peak/description/
    • 3.2 題目分析:
    • 3.3 思路講解:
    • 3.4 代碼實現:
  • 四、地圖分析
    • 4.1 題目鏈接:https://leetcode.cn/problems/as-far-from-land-as-possible/description/
    • 4.2 題目分析:
    • 4.3 思路講解:
    • 4.4 代碼實現:
  • 小結

引言

在這里插入圖片描述

上篇我們介紹了多源BFS的相關背景知識,本篇我們將結合具體題目分析,進一步深化對于BFS算法的理解運用。

一、01矩陣

1.1 題目鏈接:https://leetcode.cn/problems/01-matrix/description/

1.2 題目分析:

  • 給定一個由 0 和 1 組成的矩陣 mat ,請輸出一個大小相同的矩陣,其中每一個格子是 mat 中對應位置元素到最近的 0 的距離。

  • 兩個相鄰元素間的距離為 1 。

1.3 思路講解:

返回的矩陣中,原來為0的節點,保持為0即可,而原來為1的節點,則指應修改為到最近的0的距離

  • 根據上篇了解的多源bfs的基礎知識,我們在本題中有多個起點,即矩陣中原來為1的節點
  • 與bfs求取最短路徑相同,我們需要將起點入隊列,但是此處可以采取正難則反的思想,把0當作起點,求取最近的1

這是由于我們把1當作起點進行遍歷時,需要統計存儲多條路徑,在進行比較時較為繁瑣

  • 由于要返回同等規模的矩陣dis,我們可以在將起點入隊列時,同步將dis中相應的節點初始化為0,-1則表示尚未找到最短路徑的起點
  • 之后采取上下左右層序遍歷的方式,記錄各源點所對應的最短距離

1.4 代碼實現:

class Solution {
public:int dx[4]={0,0,-1,1};int dy[4]={1,-1,0,0};vector<vector<int>> updateMatrix(vector<vector<int>>& mat) {int m=mat.size(),n=mat[0].size();//全部初始化為-1,表示尚未計算出最短路徑vector<vector<int>> dis(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(mat[i][j]==0){dis[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 && dis[x][y]==-1){q.push({x,y});dis[x][y]=dis[a][b]+1;//步數加1}}}return dis;}
};

二、飛地的數量

2.1 題目鏈接:https://leetcode.cn/problems/number-of-enclaves/description/

2.2 題目分析:

  • 給你一個大小為 m x n 的二進制矩陣 grid ,其中 0 表示一個海洋單元格、1 表示一個陸地單元格。
  • 返回其中被0包圍的連續1的數量(可以理解為一些相鄰的1組成島嶼,被海洋包圍)
  • 邊界上的1不能算作島嶼

2.3 思路講解:

乍一看會感覺無從下手,找不出與多源bfs算法的關系,但如果同樣采取正難則反的思想,就迎刃而解了:

  • 我們把1當作起點,進行多源bfs的遍歷,如果在上下左右四個方向的遍歷過程中,找到了1,則說明這是一塊與邊界1相鄰的陸地,無法形成島嶼
  • 在全部遍歷完成后,原數組內為1且對應標記數組為false的節點,則為一塊島嶼

2.4 代碼實現:

class Solution {
public:int dx[4] = { 0,0,-1,1 };int dy[4] = { 1,-1,0,0 };int numEnclaves(vector<vector<int>>& grid) {int m = grid.size(), n = grid[0].size();vector<vector<bool>> vis(m, vector<bool>(n));//標記數組queue<pair<int, int>> q;//先將邊界的1入隊列for (int i = 0; i < m; i++){if (grid[i][0] == 1){q.push({ i,0 });vis[i][0] = true;}if (grid[i][n - 1] == 1){q.push({ i,n - 1 });vis[i][n - 1] = true;}}for (int j = 0; j < n; j++){if (grid[0][j] == 1){q.push({ 0,j });vis[0][j] = true;}if (grid[m - 1][j] == 1){q.push({ m - 1,j });vis[m - 1][j] = true;}}//多源bfswhile (q.size()){auto [a, b] = q.front();q.pop();vis[a][b] = true;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] == 1 && !vis[x][y]){q.push({ x,y });vis[x][y] = true;}}}//統計結果int ret = 0;for (int i = 0; i < m; i++){for (int j = 0; j < n; j++){if (grid[i][j] == 1 && vis[i][j] == false){ret++;}}}return ret;}
};

三、地圖中的最高點

3.1 題目鏈接:https://leetcode.cn/problems/map-of-highest-peak/description/

3.2 題目分析:

  • 給你一個大小為 m x n 的整數矩陣 isWater ,它代表了一個由 陸地水域 單元格組成的地圖。

如果 isWater[i][j] == 0 ,格子 (i, j) 是一個 陸地 格子。
如果 isWater[i][j] == 1 ,格子(i, j) 是一個 水域 格子。

  • 水域的高度必須為0,相鄰的格子之間高度差最大為1
  • 要求返回一共m x n的矩陣,使得矩陣中的最高高度值最大

3.3 思路講解:

本題與01矩陣類似,我們只需要把遍歷矩陣,將所有水域入隊列,之后在bfs遍歷過程中,將相鄰的陸地高度更新為dis[x][y]=dis[a][b]+1即可

3.4 代碼實現:

class Solution {
public:int dx[4]={0,0,-1,1};int dy[4]={1,-1,0,0};vector<vector<int>> highestPeak(vector<vector<int>>& isWater) {int m=isWater.size(),n=isWater[0].size();vector<vector<int>> dis(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]==1){q.push({i,j});dis[i][j]=0;//水域的高度為0}}}while(q.size()){int sz=q.size();while(sz--){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 && !isWater[x][y] && dis[x][y]==-1)//條件為不越界并且為陸地且為被遍歷過{q.push({x,y});dis[x][y]=dis[a][b]+1;}}}}return dis;}
};

四、地圖分析

4.1 題目鏈接:https://leetcode.cn/problems/as-far-from-land-as-possible/description/

4.2 題目分析:

  • 有一份大小為 n x n 的 網格 grid,上面的每個 單元格 都用 0 和 1 標記好了。其中 0 代表海洋,1 代表陸地。
  • 請你找出一個海洋單元格,這個海洋單元格到離它最近的陸地單元格的距離是最大的,并返回該距離。如果網格上只有陸地或者海洋,請返回 -1。
  • 我們這里說的距離是「曼哈頓距離」( Manhattan Distance):(x0, y0) 和 (x1, y1) 這兩個單元格之間的距離是 |x0 - x1| + |y0 - y1| 。

4.3 思路講解:

  • 與上題思路基本相同,采取同樣策略,將海洋入隊列層序遍歷即可
  • 注意距離的計算方式

4.4 代碼實現:

class Solution {
public:int dx[4]={0,0,-1,1};int dy[4]={1,-1,0,0};int m,n;int ret=-1;//最大高度int maxDistance(vector<vector<int>>& grid) {m=grid.size(),n=grid[0].size();vector<vector<int>> dis(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(grid[i][j]==1){dis[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]==0 && dis[x][y]==-1){q.push({x,y});dis[x][y]=dis[a][b]+1;ret=max(ret,dis[x][y]);//更新高度}}}return ret;}
};

小結

本篇關于多源bfs的介紹就暫告段落啦,希望能對大家的學習產生幫助,歡迎各位佬前來支持斧正!!!

在這里插入圖片描述

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

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

相關文章

Leetcode (力扣)做題記錄 hot100(49,136,169,20)

力扣第49題&#xff1a;字母異位詞分組 49. 字母異位詞分組 - 力扣&#xff08;LeetCode&#xff09; 遍歷數組&#xff0c;將每一個字符串變成char數組 然后排序&#xff0c;如果map里面有則將他的值返回來&#xff08;key是排序好的字符串&#xff09; class Solution {pu…

【自學30天掌握AI開發】第1天 - 人工智能與大語言模型基礎

自學30天掌握AI開發 - 第1天 &#x1f4c6; 日期和主題 日期&#xff1a;第1天 主題&#xff1a;人工智能與大語言模型基礎 &#x1f3af; 學習目標 了解人工智能的發展歷史和基本概念掌握大語言模型的基本原理和工作機制區分不同類型的AI模型及其特點理解AI在當前社會中的…

WebRTC 源碼原生端Demo入門-1

1、概述 我的代碼是比較新的&#xff0c;基于webrtc源碼倉庫的main分支的&#xff0c;在windows下把源碼倉庫下載好了后&#xff0c;用visual stdio 2022打開進行編譯調試src/examples/peerconnection_client測試項目,主要是跑通這個demo來入手和調試&#xff0c;純看代碼很難…

【LeetCode】刪除排序數組中的重復項 II

題目 鏈接 思路 雙指針 我好聰明啊&#xff0c;自己想出了這個雙指針的辦法&#xff0c;哈哈哈哈哈哈哈&#xff0c;太高興了 代碼 class Solution(object):def removeDuplicates(self, nums):""":type nums: List[int]:rtype: int"""nlen…

通義千問席卷日本!開源界“卷王”阿里通義千問成為日本AI發展新基石

據日本經濟新聞&#xff08;NIKKEI&#xff09;報道&#xff0c;通義千問已成為日本AI開發的新基礎&#xff0c;其影響力正逐步擴大&#xff0c;深刻改變著日本AI產業的格局。 同時&#xff0c;日本經濟新聞將通義千問Qwen2.5-Max列為全球AI模型綜合評測第六名&#xff0c;不僅…

第J7周:對于ResNeXt-50算法的思考

目錄 思考 一、代碼功能分析 1. 構建 shortcut 分支&#xff08;殘差連接的旁路&#xff09; 2. 主路徑的第一層卷積&#xff08;11&#xff09; 4. 主路徑的第三層卷積&#xff08;11&#xff09; 5. 殘差連接 激活函數 二、問題分析總結&#xff1a;殘差結構中通道數不一致的…

如何解決Jmeter中的亂碼問題?

在 JMeter 中遇到亂碼問題通常是由于字符編碼不一致導致的&#xff0c;常見于 HTTP 請求響應、參數化文件讀取、報告生成等場景。以下是系統化的解決方案&#xff1a; 1. HTTP 請求響應亂碼 原因&#xff1a; 服務器返回的字符編碼&#xff08;如UTF-8、GBK&#xff09;與 J…

# YOLOv2:目標檢測的升級之作

YOLOv2&#xff1a;目標檢測的升級之作 在目標檢測領域&#xff0c;YOLO&#xff08;You Only Look Once&#xff09;系列算法以其高效的速度和創新的檢測方式受到了廣泛關注。今天&#xff0c;我們就來深入探討一下 YOLOv2&#xff0c;看看它是如何在繼承 YOLOv1 的基礎上進行…

小白入!WiFi 技術大解析

WiFi&#xff0c;全稱Wireless Fidelity&#xff0c;是一種無線局域網技術&#xff0c;允許電子設備通過無線電波連接到互聯網。以下是對WiFi的一些介紹&#xff1a; 一、基本概述 定義&#xff1a;WiFi是一種基于IEEE 802.11標準系列的無線局域網技術&#xff0c;使設備能夠…

【prometheus+Grafana篇】基于Prometheus+Grafana實現windows操作系統的監控與可視化

&#x1f4ab;《博主主頁》&#xff1a; &#x1f50e; CSDN主頁 &#x1f50e; IF Club社區主頁 &#x1f525;《擅長領域》&#xff1a;擅長阿里云AnalyticDB for MySQL(分布式數據倉庫)、Oracle、MySQL、Linux、prometheus監控&#xff1b;并對SQLserver、NoSQL(MongoDB)有了…

推薦一個感覺非常好的文章,是知識圖譜的

為了省瀏覽的事兒&#xff0c;以后打算寫文章都短一些&#xff0c;這樣不用被強制登錄、關注了 正文 鏈接是 https://blog.csdn.net/Appleyk/article/details/80422055 放個截圖 推薦理由 兩個&#xff0c;第一內容確實硬核。第二算是緣分吧&#xff0c;我之前公司好像&am…

《企業級前端部署方案:Jenkins+MinIO+SSH+Gitee+Jenkinsfile自動化實踐》

文章目錄 前言前端項目CICD時序圖一、環境準備1、服務器相關2、Jenkins憑據3、注意事項 二、設計思想1. 模塊化設計2.多環境支持3. 制品管理4. 安全部署機制5. 回滾機制 三、CI階段1、構建節點選擇2、代碼拉取3、代碼編譯4、打包并上傳至minio 四、CD階段五、回滾階段六、構建通…

Go語言超時控制方案全解析:基于goroutine的優雅實現

一、引言 在構建高可靠的后端服務時&#xff0c;超時控制就像是守護系統穩定性的"安全閥"&#xff0c;它確保當某些操作無法在預期時間內完成時&#xff0c;系統能夠及時止損并釋放資源。想象一下&#xff0c;如果沒有超時控制&#xff0c;一個簡單的數據庫查詢卡住…

WTK6900C-48L:離線語音芯片重構玩具DNA,從“按鍵操控”到“聲控陪伴”的交互躍遷

一&#xff1a;開發背景 隨著消費升級和AI技術進步&#xff0c;傳統玩具的機械式互動已難以滿足市場需求。語音控制芯片的引入使玩具實現了從被動玩耍到智能交互的跨越式發展。通過集成高性價比的語音識別芯片&#xff0c;現代智能玩具不僅能精準響應兒童指令&#xff0c;還能實…

WebSocket的原理及QT示例

一.WebSocket 介紹 1.概述 WebSocket 是一種在單個 TCP 連接上進行全雙工通訊的協議&#xff0c;它在 2011 年被 IETF 定為標準 RFC 6455&#xff0c;并由 RFC7936 補充規范。與傳統的 HTTP 協議不同&#xff0c;WebSocket 允許服務器和客戶端之間進行實時、雙向的數據傳輸&a…

設置GO程序在離線情況下讀取本地緩存的模塊

在 Go 中&#xff0c;GOPROXY 環境變量用于指定模塊代理服務器的地址。如果你想讓 GOPROXY 讀取本地的模塊&#xff0c;可以通過以下幾種方式實現&#xff1a; 1. 使用本地代理服務器 你可以搭建一個本地的 Go 模塊代理服務器&#xff0c;將需要的模塊代碼推送到代理服務器中…

live555開發筆記(三):live555創建RTSP服務器源碼剖析,創建h264文件rtsp服務器源碼深度剖析

若該文為原創文章&#xff0c;轉載請注明原文出處 本文章博客地址&#xff1a;https://hpzwl.blog.csdn.net/article/details/147879917 長沙紅胖子Qt&#xff08;長沙創微智科&#xff09;博文大全&#xff1a;開發技術集合&#xff08;包含Qt實用技術、樹莓派、三維、OpenCV…

STM32-模電

目錄 一、MOS管 二、二極管 三、IGBT 四、運算放大器 五、推挽、開漏、上拉電阻 一、MOS管 1. MOS簡介 這里以nmos管為例&#xff0c;注意箭頭方向。G門極/柵極&#xff0c;D漏極&#xff0c;S源極。 當給G通高電平時&#xff0c;燈泡點亮&#xff0c;給G通低電平時&a…

基于定制開發開源AI智能名片S2B2C商城小程序的公私域流量融合運營策略研究

摘要&#xff1a;本文以定制開發開源AI智能名片S2B2C商城小程序為技術載體&#xff0c;系統探討公域流量向私域流量沉淀的數字化路徑。研究通過分析平臺流量&#xff08;公域流量&#xff09;與私域流量的共生關系&#xff0c;提出"公域引流-私域沉淀-數據反哺"的閉環…

mysql中索引的使用

前言 最近一直在學習mysql以及忙學校課程的事情。已經好久沒寫過博客了&#xff0c;今天跟大家分享一下在mysql中關于索引的知識&#xff0c;希望可以幫助到大家。 索引的定義 mysql中的索引是一種數據結構&#xff0c;它可以幫助數據庫高效地查詢&#xff0c;更新數據表中的…