到達角落所需清除的障礙物最少
2290。最少清除障礙物才能到達轉角
難度:難
主題:陣列、廣度優先搜尋、圖、堆疊(優先權佇列)、矩陣、最短路徑
給你一個 0 索引 大小為 m x n 的 2D 整數陣列網格。每個單元格都有兩個值之一:
- 0 代表空白單元格,
- 1 代表可以移除的障礙物。
您可以在空白儲存格之間向上、向下、向左或向右移動。
將最小個障礙物回到移除,這樣你就可以從左上角(0, 0)移到右下角角(m - 1, n - 1).
範例1:
- 輸入: grid = [[0,1,1],[1,1,0],[1,1,0]]
- 輸出: 2
-
解釋:我們可以移除 (0, 1) 和 (0, 2) 處的障礙物,創造一條從 (0, 0) 到 (2, 2) 的路徑。
- 可以證明我們需要移除至少 2 個障礙物,因此我們返回 2。
- 請注意,可能還有其他方法可以移除 2 個障礙物來建立一條路徑。
範例2:
- 輸入: grid = [[0,1,0,0,0],[0,1,0,1,0],[0,0,0,1,0]]
- 輸出: 0
- 解釋:我們可以在不移除任何障礙的情況下從 (0, 0) 移動到 (2, 4),因此我們返回 0。
約束:
- m == grid.length
- n == grid[i].length
- 1 5
- 2 5
- grid[i][j] 為 0 或 1。
- 網格[0][0] == 網格[m - 1][n - 1] == 0
提示:
- 將網格建模為圖形,其中單元格是節點,邊是相鄰單元格之間的。有障礙物的單元格的邊緣的成本為 1,所有其他邊緣的成本為 0。
- 你能使用0-1廣度優先搜尋或Dijkstra演算法嗎?
解:
我們需要使用圖表來模擬這個問題,其中網格中的每個單元格都是一個節點。目標是從左上角 (0, 0) 導航到右下角 (m-1, n-1),同時最大限度地減少我們需要移除的障礙物 (1s) 的數量。
方法:
-
圖形表示:
- 網格中的每個單元格都是一個節點。
- 相鄰單元格之間的移動(上、下、左、右)被視為邊緣。
- 如果一條邊穿過帶有 1(障礙物)的單元格,則成本為 1(移除障礙物),如果它穿過 0(空單元格),則成本為 0。
-
演算法選擇:
- 由於我們需要最小化移除的障礙物數量,因此我們可以使用0-1 BFS(使用雙端隊列的廣度優先搜尋)或Dijkstra 演算法 以及優先級隊列。
- 0-1 BFS 適合這裡,因為每條邊的成本為 0 或 1。
-
0-1 BFS:
- 我們使用deque(雙端佇列)來處理不同成本的節點:
- 將成本為 0 的單元推到雙端隊列的前方。
- 將成本為 1 的單元推到雙端隊列的後面。
- 這個想法是探索網格並始終先擴展不需要移除障礙物的路徑,並且僅在必要時移除障礙物。
- 我們使用deque(雙端佇列)來處理不同成本的節點:
讓我們用 PHP 實作這個解:2290。到達角落所需清除的最小障礙物
解釋:
-
輸入解析:
- 網格被視為二維數組。
- 計算行和列以進行邊界檢查。
-
雙端隊列實作:
- SplDoublyLinkedList用來模擬雙端佇列。支援在前面(unshift)或後面(push)添加元素。
-
已存取陣列:
- 追蹤已造訪過的儲存格以避免冗餘處理。
-
0-1 BFS 邏輯:
- 從 (0, 0) 開始,成本為 0。
- 對於每個相鄰單元格:
- 如果為空(grid[nx][ny] == 0),則以相同的成本將其添加到雙端隊列的前面。
- 如果它是一個障礙物 (grid[nx][ny] == 1),則將其添加到雙端隊列的後面,並增加成本。
-
回傳結果:
- 到達右下角時,回程費用。
- 如果不存在有效路徑(儘管問題保證有一個),則回傳 -1。
複雜:
- 時間複雜度: O(m x n),其中m 是行數,n 是列數。每個單元格都會被處理一次。 空間複雜度:
- O(m x n),對於存取的陣列和雙端隊列。 此實現在給定的限制內有效地工作。
如果您發現本系列有幫助,請考慮在 GitHub 上給 存儲庫 一個星號或在您最喜歡的社交網絡上分享該帖子? 。您的支持對我來說意義重大! 如果您想要更多類似的有用內容,請隨時關注我:
以上是到達角落所需清除的障礙物最少的詳細內容。更多資訊請關注PHP中文網其他相關文章!

熱AI工具

Undresser.AI Undress
人工智慧驅動的應用程序,用於創建逼真的裸體照片

AI Clothes Remover
用於從照片中去除衣服的線上人工智慧工具。

Undress AI Tool
免費脫衣圖片

Clothoff.io
AI脫衣器

Video Face Swap
使用我們完全免費的人工智慧換臉工具,輕鬆在任何影片中換臉!

熱門文章

熱工具

記事本++7.3.1
好用且免費的程式碼編輯器

SublimeText3漢化版
中文版,非常好用

禪工作室 13.0.1
強大的PHP整合開發環境

Dreamweaver CS6
視覺化網頁開發工具

SublimeText3 Mac版
神級程式碼編輯軟體(SublimeText3)

JWT是一種基於JSON的開放標準,用於在各方之間安全地傳輸信息,主要用於身份驗證和信息交換。 1.JWT由Header、Payload和Signature三部分組成。 2.JWT的工作原理包括生成JWT、驗證JWT和解析Payload三個步驟。 3.在PHP中使用JWT進行身份驗證時,可以生成和驗證JWT,並在高級用法中包含用戶角色和權限信息。 4.常見錯誤包括簽名驗證失敗、令牌過期和Payload過大,調試技巧包括使用調試工具和日誌記錄。 5.性能優化和最佳實踐包括使用合適的簽名算法、合理設置有效期、

會話劫持可以通過以下步驟實現:1.獲取會話ID,2.使用會話ID,3.保持會話活躍。在PHP中防範會話劫持的方法包括:1.使用session_regenerate_id()函數重新生成會話ID,2.通過數據庫存儲會話數據,3.確保所有會話數據通過HTTPS傳輸。

SOLID原則在PHP開發中的應用包括:1.單一職責原則(SRP):每個類只負責一個功能。 2.開閉原則(OCP):通過擴展而非修改實現變化。 3.里氏替換原則(LSP):子類可替換基類而不影響程序正確性。 4.接口隔離原則(ISP):使用細粒度接口避免依賴不使用的方法。 5.依賴倒置原則(DIP):高低層次模塊都依賴於抽象,通過依賴注入實現。

在PHPStorm中如何進行CLI模式的調試?在使用PHPStorm進行開發時,有時我們需要在命令行界面(CLI)模式下調試PHP�...

如何在系統重啟後自動設置unixsocket的權限每次系統重啟後,我們都需要執行以下命令來修改unixsocket的權限:sudo...

靜態綁定(static::)在PHP中實現晚期靜態綁定(LSB),允許在靜態上下文中引用調用類而非定義類。 1)解析過程在運行時進行,2)在繼承關係中向上查找調用類,3)可能帶來性能開銷。
