算法刷題記錄——LeetCode篇(10) [第901~1000題](持續更新)

(優先整理熱門100及面試150,不定期持續更新,歡迎關注)


994. 腐爛的橘子

在給定的 m x n 網格 grid 中,每個單元格可以有以下三個值之一:

  • 0 代表空單元格;
  • 1 代表新鮮橘子;
  • 2 代表腐爛的橘子。

每分鐘,腐爛的橘子周圍 4 個方向上相鄰 的新鮮橘子都會腐爛。
返回直到單元格中沒有新鮮橘子為止所必須經過的最小分鐘數。如果不可能,返回 -1

示例 1:

輸入:grid = [[2,1,1],[1,1,0],[0,1,1]]
輸出:4

示例 2:

輸入:grid = [[2,1,1],[0,1,1],[1,0,1]]
輸出:-1

解釋:左下角的橘子(第 2 行, 第 0 列)永遠不會腐爛,因為腐爛只會發生在 4 個方向上。

示例 3:

輸入:grid = [[0,2]]
輸出:0

解釋:因為 0 分鐘時已經沒有新鮮橘子了,所以答案就是 0 。

提示:

  • m == grid.length
  • n == grid[i].length
  • 1 <= m, n <= 10
  • grid[i][j] 僅為 0、1 或 2

方法:廣度優先搜索 (BFS)

使用 BFS 模擬橘子腐爛過程,記錄每個層次的處理時間。初始隊列包含所有腐爛橘子,每處理完一層后若該層導致新腐爛,則時間加 1。

  1. 初始化:遍歷網格,記錄所有腐爛橘子的位置和新鮮橘子數量。
  2. 特殊情況:若沒有新鮮橘子,直接返回 0。
  3. BFS 處理:逐層處理隊列中的腐爛橘子,腐爛其周圍的新鮮橘子,并記錄時間。
  4. 結果判斷:若仍存在未腐爛的新鮮橘子,返回 -1;否則返回總時間。

代碼實現(Java)

class Solution {public int orangesRotting(int[][] grid) {int rows = grid.length;int cols = grid[0].length;Queue<int[]> queue = new LinkedList<>();int fresh = 0;// 初始化隊列和新鮮橘子計數for (int i = 0; i < rows; i++) {for (int j = 0; j < cols; j++) {if (grid[i][j] == 2) {queue.offer(new int[]{i, j});} else if (grid[i][j] == 1) {fresh++;}}}// 沒有新鮮橘子直接返回0if (fresh == 0) return 0;int[][] dirs = {{0, 1}, {0, -1}, {1, 0}, {-1, 0}};int time = 0;while (!queue.isEmpty()) {int size = queue.size();boolean hasRotten = false;// 處理當前層的所有節點for (int i = 0; i < size; i++) {int[] point = queue.poll();for (int[] dir : dirs) {int x = point[0] + dir[0];int y = point[1] + dir[1];// 檢查邊界且是否為新鮮橘子if (x >= 0 && x < rows && y >= 0 && y < cols && grid[x][y] == 1) {grid[x][y] = 2;queue.offer(new int[]{x, y});fresh--;hasRotten = true;}}}// 若當前層導致腐爛,時間加1if (hasRotten) time++;}// 若仍有新鮮橘子返回-1,否則返回時間return fresh == 0 ? time : -1;}
}

復雜度分析

  • 時間復雜度O(m×n),每個節點最多被訪問一次。
  • 空間復雜度O(m×n),隊列在最壞情況下存儲所有腐爛橘子。

博客源文件Gitee倉庫:

gitee.com/richardmilos/allen-csdn-notes

(持續更新,未完待續)

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

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

相關文章

Secs/Gem第二講 (基于secs4net項目的ChatGpt介紹)

好的&#xff0c;我們正式進入&#xff1a; 第二講&#xff1a;深入 SECS4NET 項目結構——主機程序是怎么搭起來的&#xff1f; 關鍵詞&#xff1a;項目結構、類圖、通信類、事件處理、連接生命周期、異步機制 本講目的 我們從源碼入手&#xff0c;一步步搞懂&#xff1a; S…

壓測實戰 | 微信小程序商城 “雙 11” 的壓測實踐

背景 某全球知名珠寶品牌&#xff0c;始終以創新驅動零售變革。隨著全渠道戰略的深化&#xff0c;其小程序官方商城逐漸成為品牌私域流量的核心陣地&#xff0c;不僅承載了線上銷售、會員運營等功能&#xff0c;同時還與其內部系統打通&#xff0c;如會員管理系統、人力資源系…

垃圾分類--環境配置

寫在前面&#xff1a; 如果你們打這屆比賽時&#xff0c;還有我們所保留的內存卡&#xff0c;那么插上即可運行&#xff08;因為內存卡里我們已經配置好所有的環境&#xff09; 本文提供兩種環境的配置 一種是基于yolov8&#xff1a;YOLOv8 - Ultralytics YOLO Docshttps://d…

工具(十二):Java導出MySQL數據庫表結構信息到excel

一、背景 遇到需求&#xff1a;將指定數據庫表設計&#xff0c;統一導出到一個Excel中&#xff0c;存檔查看。 如果一個一個弄&#xff0c;很復雜&#xff0c;耗時長。 二、寫一個工具導出下 廢話少絮&#xff0c;上碼&#xff1a; 2.1 pom導入 <dependency><grou…

Postman 新手入門指南:從零開始掌握 API 測試

Postman 新手入門指南&#xff1a;從零開始掌握 API 測試 一、Postman 是什么&#xff1f; Postman 是一款功能強大的 API 開發與測試工具&#xff0c;支持 HTTP 請求調試、自動化測試、團隊協作等功能。無論是開發人員還是測試工程師&#xff0c;都可以用它快速驗證接口的正確…

運維工具推薦 -- 寶塔面板:一鍵部署服務器

標題&#xff1a;寶塔面板&#xff1a;一鍵部署服務器&#xff0c;輕松管理你的云端世界 引言 在數字化時代&#xff0c;服務器管理對于個人開發者、中小企業或站長來說既是機遇也是挑戰。手動配置服務器環境耗時費力&#xff0c;而 寶塔面板 作為一款 免費開源、功能全面 的服…

【軟件工程】03_軟件需求分析

3.1 系統分析 1. 系統分析概述 系統分析是一組統稱為計算機系統工程的活動。它著眼于所有的系統元素,而非僅僅局限于軟件。系統分析主要探索軟件項目的目標、市場預期、主要的技術指標等,其目的在于幫助決策者做出是否進行軟件項目立項的決定。 2. 可行性分析(Feasibility …

WD5202L超低成本 Buck 電源芯片的特性與應用電路解析, 將市電轉換為 5V 電壓

WD5202L&#xff1a;超低成本 Buck 電源芯片的特性與應用電路解析 在現代電子設備的小型化、低成本化趨勢下&#xff0c;對電源管理芯片的性能、成本和尺寸提出了嚴苛要求。WD5202L 作為一款超低成本的 Buck 電源芯片&#xff0c;憑借其獨特的特性&#xff0c;在眾多應用場景中…

UART轉AHB模塊ModelSim仿真

一、簡介 UART轉AHB模塊用于實現一種簡單的通過上位機控制FPGA內部寄存器的方式。上位機通過串口助手發送讀寫寄存器的指令&#xff0c;UART轉AHB模塊接收指令后解析出地址&#xff0c;命令&#xff0c;數據信息&#xff0c;然后轉成AHB總線格式輸出。這時UART轉AHB模塊相當于A…

Qt5.15.2實現Qt for WebAssembly與示例

目錄 1.什么是Qt for WebAssembly&#xff1f; 1.1 什么是 WebAssembly&#xff1f; 1.2 WebAssembly 的優勢 1.3 什么是 Qt for WebAssembly&#xff1f; 1.4 Qt for WebAssembly 的特點 1.5 編譯過程 1.6 運行時環境 注意&#xff01;&#xff01;&#xff01;注意&am…

AGI大模型(8):提示詞的安全與防護

1 前言 著名的「奶奶漏洞」&#xff0c;?套路把 AI 繞懵。 2 常?的提示詞攻擊技術 2.1 同類型?標劫持 同類?標劫持攻擊&#xff0c;特別是在同類型任務的背景下&#xff0c;涉及到攻擊者通過?法?段控制模型&#xff0c;并迫使其執行與原始任務性質相同但?標不同的操作…

使用redis客戶端中對于json數據格式的存儲和讀取

代碼背景&#xff1a; 現在有一個json格式的數據&#xff0c;但是由于redis客戶端上面沒辦法直接創建/導入json的數據格式。 故考慮現在redis客戶端上先存儲一個名為"old_order"的string類型的的源數據。 思路&#xff1a; 由于直接使用redisTemplate獲取自動導入…

專題三搜索插入位置

1.題目 題目分析&#xff1a; 給一個目標值&#xff0c;然后要在排序的整數數組中&#xff0c;找到跟目標值一樣的&#xff0c;如果沒有就把這個值插入進去&#xff0c;然后返回插入后的下標。 2.算法原理 根據題目的時間復雜度可以知道要用二分&#xff0c;開始劃分區域&…

Redis監控:從睜眼瞎到千里眼的進化史

各位在Redis迷霧中摸黑的探險家們&#xff01;今天我們要給Redis裝上"天眼系統"——從連自己內存爆了都不知道的睜眼瞎&#xff0c;進化到連每秒哪個鍵被摸了幾次都門兒清的監控狂魔&#xff01;準備好迎接《Redisの楚門世界》了嗎&#xff1f;&#x1f441;? 第一幕…

雙緩沖機制(含原理、優勢、實現方式、應用場景)

雙緩沖機制 一、雙緩沖機制的原理二、雙緩沖的典型應用場景三、雙緩沖的優勢四、雙緩沖的實現方式1. 硬件級雙緩沖2. 軟件級雙緩沖3. 性能提升對比 五、雙緩沖的挑戰與解決方案六、總結 雙緩沖機制是一種通過使用兩個緩沖區&#xff08;Buffer A 和 Buffer B&#xff09;來優化…

Linux 進程的創建、終止、等待與程序替換函數 保姆級講解

目錄 一、 進程創建 fork函數 二、進程的終止&#xff1a; 1. 想明白&#xff1a;終止是在做什么&#xff1f; 2.進程終止的3種情況&#xff1f; a.退出碼是什么&#xff1f;存在原因&#xff1f;為什么int main&#xff08;&#xff09;return 0? b.第三種進程終止的情況…

深入了解Linux —— git三板斧

版本控制器git 為了我們方便管理不同版本的文件&#xff0c;就有了版本控制器&#xff1b; 所謂的版本控制器&#xff0c;就是能夠了解到一個文件的歷史記錄&#xff08;修改記錄&#xff09;&#xff1b;簡單來說就是記錄每一次的改動和版本迭代的一個管理系統&#xff0c;同…

STM32---FreeRTOS事件標志組

一、簡介 事件標志位&#xff1a;用一個位&#xff0c;來表示事件是否發生 事件標志組&#xff1a;一組事件標志位的集合&#xff0c;可以簡單的理解時間標志組&#xff0c;就是一個整體。 事件標志租的特點&#xff1a; 它的每一個位表示一個時間&#xff08;高8位不算&…

在centOS Linux系統搭建自動化構建工具Jenkins

前言 在工作中發現公司使用Jenkins實現自動化部署項目方案&#xff0c;于是閑著自己也搗鼓一下&#xff0c;網上查閱相關部署資料&#xff0c;順便記錄操作步驟&#xff0c;所以有了下面這篇的文章。 部署完之后&#xff0c;安裝前端項目所需環境&#xff0c;比如node環境&am…

Git下載安裝(保姆教程)

目錄 1、Git下載 2、Git安裝&#xff08;windows版&#xff09; &#xff08;1&#xff09;啟動安裝程序 &#xff08;2&#xff09;閱讀許可協議 &#xff08;3&#xff09;選擇安裝路徑 &#xff08;4&#xff09;選擇組件 &#xff08;5&#xff09;選擇開始菜單文件夾…