【圖論】200. 島嶼問題

200. 島嶼問題

難度:中等
力扣地址:https://leetcode.cn/studyplan/top-100-liked/

在這里插入圖片描述

問題描述

給你一個由 '1'(陸地)和 '0'(水)組成的的二維網格,請你計算網格中島嶼的數量。

島嶼總是被水包圍,并且每座島嶼只能由水平方向和/或豎直方向上相鄰的陸地連接形成。

此外,你可以假設該網格的四條邊均被水包圍。

示例 1:

輸入:grid = [
[“1”,“1”,“1”,“1”,“0”],
[“1”,“1”,“0”,“1”,“0”],
[“1”,“1”,“0”,“0”,“0”],
[“0”,“0”,“0”,“0”,“0”]
]
輸出:1

示例 2:

輸入:grid = [
[“1”,“1”,“0”,“0”,“0”],
[“1”,“1”,“0”,“0”,“0”],
[“0”,“0”,“1”,“0”,“0”],
[“0”,“0”,“0”,“1”,“1”]
]
輸出:3

提示:

  • m == grid.length
  • n == grid[i].length
  • 1 <= m, n <= 300
  • grid[i][j] 的值為 '0''1'

問題分析

有沒有小伙伴跟我一樣,這類題目一看就想嘗試一下深度優先遍歷 DFS ?

DFS 寫起來比較簡單,也比較容易理解,所以真心推薦合適場景下考慮 DFS。

如下圖所示,白色筷子表示 “水”,也就是遍歷時的邊界。
在這里插入圖片描述
所以接下的問題就非常簡單,我們從 (0, 0) 這個坐標出發,如果是陸地就 travel,也就是 DFS 遍歷,如果是水,就修改方向,如果沒有地方去了,就切換到下一個陸地。

(為了更好理解,我們可以考慮:把經過的陸地,全部都換成水,避免下次還來這個地方)

解題代碼

對應的 C++ 代碼如下:

class Solution {
public:void travel(vector<vector<char>>& grid, int x, int y) {// 遇到邊界或沒有可訪問的點if (x >= grid.size() || x < 0 || y >= grid[0].size() || y < 0 || grid[x][y] == '0') {return;}// 標記一下已經訪問grid[x][y] = '0';// 四個方向 traveltravel(grid, x + 1, y);travel(grid, x - 1, y);travel(grid, x, y + 1);travel(grid, x, y - 1);}int numIslands(vector<vector<char>>& grid) {// 記錄結果int result = 0;// 根據 (i, j) 開始嘗試 travelfor (int i = 0; i < grid.size(); i++) {for (int j = 0; j < grid[0].size(); j++) {// 如果遇到的這個點是陸地if (grid[i][j] == '1') {// 開始traveltravel(grid, i, j);// travel 結束后 + 1,表示那一片陸地已經訪問過了result += 1;}}}return result;}
};
  • 時間復雜度:O(MN)
  • 空間復雜度:O(MN)

在這里插入圖片描述

對應的 java 代碼如下:

class Solution {// 定義 travel 方法public void travel(char[][] grid, int x, int y) {// 遇到邊界或沒有可訪問的點if (x >= grid.length || x < 0 || y >= grid[0].length || y < 0 || grid[x][y] == '0') {return;}// 標記已經訪問過的點grid[x][y] = '0';// 四個方向進行遞歸調用travel(grid, x + 1, y);travel(grid, x - 1, y);travel(grid, x, y + 1);travel(grid, x, y - 1);}// 定義 numIslands 方法public int numIslands(char[][] grid) {// 記錄結果int result = 0;// 遍歷整個網格for (int i = 0; i < grid.length; i++) {for (int j = 0; j < grid[0].length; j++) {// 如果遇到陸地if (grid[i][j] == '1') {// 開始進行遞歸訪問travel(grid, i, j);// 訪問結束后計數加一result++;}}}// 返回結果return result;}
}

對應的python代碼為

class Solution:def travel(self, grid, x, y):# 遇到邊界或沒有可訪問的點if x >= len(grid) or x < 0 or y >= len(grid[0]) or y < 0 or grid[x][y] == '0':return# 標記已經訪問過的點grid[x][y] = '0'# 四個方向進行遞歸調用self.travel(grid, x + 1, y)self.travel(grid, x - 1, y)self.travel(grid, x, y + 1)self.travel(grid, x, y - 1)def numIslands(self, grid):# 記錄結果result = 0# 遍歷整個網格for i in range(len(grid)):for j in range(len(grid[0])):# 如果遇到陸地if grid[i][j] == '1':# 開始進行遞歸訪問self.travel(grid, i, j)# 訪問結束后計數加一result += 1# 返回結果return result

總結

作為 DFS 的一個比較簡單的例子,限制條件也比較少,只需要考慮邊界問題即可。先應該學習一下 DFS 的基本邏輯,然后能夠寫 DFS 的代碼,在此基礎上稍微改改就可以刷這道題。

我更加想稱這個操作為防水游戲,就是把每塊島嶼都用海水淹沒,看看需要操作多少次。

多謝小伙伴們的點贊支持 ~

Smileyan
2024.06.30 23:52

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

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

相關文章

一個專為Android平臺設計的高度可定制的日歷庫

大家好&#xff0c;今天給大家分享一個高度可定制的日歷庫kizitonwose/Calendar。 Calendar專為Android平臺設計&#xff0c;支持RecyclerView和Compose框架。它提供了豐富的功能&#xff0c;允許開發者根據需求定制日歷的外觀和功能。 項目介紹 此庫是開發Android應用時&…

大型語言模型評估調查

原文鏈接&#xff1a;A Survey on Evaluation of Large Language Models | ACM Transactions on Intelligent Systems and Technology 本文從三個關鍵維度&#xff1a;評價什么、在哪里評價和如何評價&#xff0c;對這些 LLMs 評價方法進行了全面回顧。 首先&#xff0c;我們…

第十四屆藍橋杯省賽C++A組F題【買瓜】題解(AC)

70pts 題目要求我們在給定的瓜中選擇一些瓜&#xff0c;可以選擇將瓜劈成兩半&#xff0c;使得最后的總重量恰好等于 m m m。我們的目標是求出至少需要劈多少個瓜。 首先&#xff0c;我們注意到每個瓜的重量最多為 1 0 9 10^9 109&#xff0c;而求和的重量 m m m 也最多為…

C++ 徹底搞懂指針(1)

當有人問起,什么是指針時,我會毫不猶豫地回答,指針變量存放的是地址!然后呢,好像也說不出什么了,今天就再來詳細看一下指針吧。 本文提綱如下: ? 指針變量 ? 未初始化的指針 ? NULL ? void指針 ? 指針的指針 首先要明白幾點: ? 每個字節都有…

用OpenAI接口給女朋友手搓AI小助理,她說要獎勵我,結果……

前言 最近&#xff0c;我那財經系的小女友迎來了考試周&#xff0c;她的復習資料已經堆得像珠穆朗瑪峰一樣高。壓力山大的她不斷讓我幫她整理這些資料&#xff0c;還頻頻向我傾訴她的苦水。雖然我自己也挺忙的&#xff0c;但為了愛&#xff0c;我只能忍痛扛起這重擔。。。為了…

【C++】STL-priority_queue

目錄 1、priority_queue的使用 2、實現沒有仿函數的優先級隊列 3、實現有仿函數的優先級隊列 3.1 仿函數 3.2 真正的優先級隊列 3.3 優先級隊列放自定義類型 1、priority_queue的使用 priority_queue是優先級隊列&#xff0c;是一個容器適配器&#xff0c;不滿足先進先出…

Spring Boot配置文件properties/yml/yaml

一、Spring Boot配置文件簡介 &#xff08;1&#xff09;名字必須為application,否則無法識別。后綴有三種文件類型&#xff1a; properties/yml/yaml&#xff0c;但是yml和yaml使用方法相同 &#xff08;2&#xff09; Spring Boot 項?默認的配置文件為 properties &#xff…

【單片機畢業設計選題24041】-基于STM32的水質檢測系統

系統功能: 系統上電后顯示“歡迎使用水質檢測系統請稍后”兩秒后進入正常顯示頁面。 第一頁面第一行顯示“系統狀態信息”&#xff0c;第二行顯示溫度和PH值信息&#xff0c;第三行顯示 渾濁度信息&#xff0c;第四行顯示TDS值信息。 第一頁面下的按鍵操作&#xff1a; 短…

Kotlin中的類

類初始化順序 constructor 里的參數列表是首先被執行的&#xff0c;緊接著是 init 塊和屬性初始化器&#xff0c;最后是次構造函數的函數體。 主構造函數參數列表firstProperty 初始化第一個 init 塊secondProperty 初始化第二個 init 塊次構造函數函數體 class Example const…

英語動詞時態

英語動詞時態總結 動詞時態一般進行完成完成進行現在一般現在時態動詞原形/動詞原形s&#xff08;第三人稱單數&#xff09;eat/eats現在進行時態助動詞be的變位動詞的現在分詞am/is/are eating現在完成時態助動詞have的變位動詞的過去分詞has/have eaten現在完成進行時態have…

SSE代替輪詢?

什么是 SSE SSE&#xff08;Server-Sent Events&#xff0c;服務器發送事件&#xff09;&#xff0c;為特定目的而擴展的 HTTP 協議&#xff0c;用于實現服務器向客戶端推送實時數據的單向通信。如果連接斷開&#xff0c;瀏覽器會自動重連&#xff0c;傳輸的數據基于文本格式。…

力扣(2024.07.01)

1. 84——柱狀圖中最大的矩形 給定 n 個非負整數&#xff0c;用來表示柱狀圖中各個柱子的高度。每個柱子彼此相鄰&#xff0c;且寬度為 1 。 求在該柱狀圖中&#xff0c;能夠勾勒出來的矩形的最大面積。 標簽&#xff1a;棧&#xff0c;數組&#xff0c;單調棧&#xff08;目…

面試題--SpringBoot

SpringBoot SpringBoot 是什么(了解) 是 Spring 的子項目,主要簡化 Spring 開發難度,去掉了繁重配置,提供各種啟動器,可以 讓程序員很快上手,節省開發時間. SpringBoot 的優點(必會) SpringBoot 對上述 Spring 的缺點進行的改善和優化&#xff0c;基于約定優于配置的思想&am…

rust嵌入式開發2024

老的rust embedded book 其實過時了. 正確的姿勢是embassy 入手. 先說下以前rust寫嵌入怎么教學小白的. 第一步,從這里 svd2rust 工具,自己生成庫第二部,有了這個庫,相當于就有了pac外設訪問文件,然后其實就可以搞起來了. 那么為啥不好搞了. 因為太亂了. 小白喜歡你告我咋弄…

[python][Anaconda]使用jupyter打開F盤或其他盤文件

jupyter有一個非常不好的體驗&#xff0c;就是不能在界面切換到其他盤來打開文件。 使用它&#xff0c;比較死板的操作是要先進入文件目錄&#xff0c;再運行jupyter。 以Windows的Anaconda安裝了jupyter lab或jupyter notebook為例。 1&#xff0c;先運行Anaconda Prompt 2&…

[Day 22] 區塊鏈與人工智能的聯動應用:理論、技術與實踐

大數據與AI的關聯性 引言 大數據和人工智能&#xff08;AI&#xff09;是當今科技界的兩大熱門話題。這兩者的聯繫愈加緊密&#xff0c;相互影響和促進&#xff0c;形成了一個強大的技術生態系統。大數據提供了豐富的數據來源&#xff0c;而AI則利用這些數據來訓練和優化算法…

基于OpenCV與Keras的停車場車位自動識別系統

本項目旨在利用計算機視覺技術和深度學習算法&#xff0c;實現對停車場車位狀態的實時自動識別。通過攝像頭監控停車場內部&#xff0c;系統能夠高效準確地辨認車位是否被占用&#xff0c;為車主提供實時的空閑車位信息&#xff0c;同時為停車場管理者提供智能化的車位管理工具…

網優小插件_基于chrome瀏覽器Automa插件編寫抓取物業點信息小工具

日常在無線網絡優化&#xff0c;經常需要提取某一地市&#xff0c;某個屬性物業點信息&#xff08;物業點名稱、地址、及經緯度信息&#xff09;&#xff0c;本文介紹基于chrome瀏覽器Automat插件開發自動化工具&#xff0c;利用百度地圖經緯度拾取網資源開發一個抓取物業點基本…

2024年了cv還有什么可以卷的嗎?

2024年&#xff0c;計算機視覺&#xff08;CV&#xff09;領域依然有很多可以探索和創新的方向。以下是一些潛在的研究熱點&#xff1a; 自監督學習與無監督學習&#xff1a;繼續探索如何在沒有大量標注數據的情況下訓練高性能的模型&#xff0c;尤其是跨模態自監督學習和多任務…

為什么這幾年參加PMP考試的人越來越多

參加PMP認證的人越來越多的原因我認為和社會發展、職場競爭、個人提升等等方面有著不小的關系。國際認證與國內認證的性質、發展途徑會有一些區別&#xff0c;PMP引進到中國二十余年&#xff0c;報考人數持增長狀態也是正常的。 具體可以從下面這幾個點來展開論述。 市場競爭…