LeetCode 200. 島嶼數(shù)量

200. 島嶼數(shù)量


題目來源:https://leetcode-cn.com/problems/number-of-islands/

題目


給你一個由 '1'(陸地)和 '0'(水)組成的的二維網(wǎng)格疟位,請你計算網(wǎng)格中島嶼的數(shù)量毅往。

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

此外剔氏,你可以假設(shè)該網(wǎng)格的四條邊均被水包圍为朋。

示例 1:

輸入:
11110
11010
11000
00000
輸出: 1

示例 2:

輸入:
11000
11000
00100
00011
輸出: 3
解釋: 每座島嶼只能由水平和/或豎直方向上相鄰的陸地連接而成疤孕。

解題思路


方法一:深度優(yōu)先搜索

當(dāng)要求出島嶼的數(shù)量時慌核,我們可以掃描題目給出的二維網(wǎng)格距境。如果遍歷的元素為 1,則以這個位置為起點進(jìn)行深度優(yōu)先搜索垮卓。

這里需要注意的是:深度優(yōu)先搜索的過程中垫桂,已經(jīng)搜索到的 1 要標(biāo)記為 0,表示已經(jīng)訪問過粟按。

那么進(jìn)行深度優(yōu)先搜索的次數(shù)就是要求的島嶼的數(shù)量诬滩。

詳細(xì)部分見代碼注釋霹粥。

方法二:廣度優(yōu)先搜索

同樣的,這道題也可以使用廣度優(yōu)先搜索進(jìn)行替換解答疼鸟。不過后控,這里需要增加一個輔助隊列。

同樣的空镜,求島嶼的數(shù)量浩淘,先掃描遍歷二維網(wǎng)格,如果遍歷的位置元素為 1吴攒,要將其加入隊列张抄,同時標(biāo)記為訪問過,這里同樣避免重復(fù)被加入隊列中洼怔,導(dǎo)致代碼運行超時欣鳖。(如果遇到超時的情況,可檢查隊列中的變化是否有重復(fù)添加的現(xiàn)象茴厉。)直到隊列為空時泽台,搜索結(jié)束。

同樣進(jìn)行廣度優(yōu)先搜索的次數(shù)就是要求的島嶼數(shù)量矾缓。

文字表述比較繁瑣難懂怀酷,可以結(jié)合代碼了解思想。

具體的代碼實現(xiàn)如下嗜闻。

代碼實現(xiàn)


方法一: 深度優(yōu)先搜索 | 代碼實現(xiàn)
class Solution:
    def numIslands(self, grid: List[List[str]]) -> int:
        m = len(grid)
        if m == 0:
            return 0
        n = len(grid[0])

        
        # 四個方位
        directions = [(0, 1), (1, 0), (0, -1), (-1, 0)]

        def _dfs(grid, x, y):
            # 進(jìn)行深度優(yōu)化搜索蜕依,標(biāo)記已訪問
            grid[x][y] = '0'
            for dx, dy in directions:
                nx = x + dx
                ny = y + dy
                if 0 <= nx < m and 0 <= ny < n and grid[nx][ny] == '1':
                    _dfs(grid, nx, ny)

        ans = 0

        for x in range(m):
            for y in range(n):
                # 遍歷,當(dāng)為陸地時琉雳,進(jìn)行深度優(yōu)化搜索
                if grid[x][y] == '1':
                    ans += 1
                    _dfs(grid, x, y)

        return ans

方法二: 廣度優(yōu)先搜索 | 代碼實現(xiàn)
class Solution:
    def numIslands(self, grid: List[List[str]]) -> int:
        from collections import deque

        m = len(grid)
        if m == 0:
            return 0
        n = len(grid[0])

        ans = 0

        directions = [(0, 1), (1, 0), (0, -1), (-1, 0)]

        for row in range(m):
            for col in range(n):
                # 掃描遍歷样眠,
                # 當(dāng)為陸地,進(jìn)行廣度優(yōu)化搜索
                if grid[row][col] == '1':
                    ans += 1
                    # 標(biāo)記已經(jīng)訪問
                    grid[row][col] = '0'
                    # 創(chuàng)建輔助隊列翠肘,同時防止重復(fù)搜索
                    queue = deque([(row, col)])
                    # 隊列不為空的情況下檐束,繼續(xù)進(jìn)行搜索
                    while queue:
                        x, y = queue.popleft()
                        for dx, dy in directions:
                            nx = x + dx
                            ny = y + dy
                            if 0 <= nx < m and 0 <= ny < n and grid[nx][ny] == '1':
                                # 入隊列,防止重復(fù)
                                queue.append((nx, ny))
                                # 標(biāo)記已訪問
                                grid[nx][ny] = '0'

        return ans


實現(xiàn)結(jié)果


方法一: 深度優(yōu)先搜索 | 實現(xiàn)結(jié)果
深度優(yōu)化搜索 | 實現(xiàn)結(jié)果
方法二: 廣度優(yōu)先搜索 | 實現(xiàn)結(jié)果
廣度優(yōu)化搜索 | 實現(xiàn)結(jié)果

以上就是使用深度優(yōu)先搜索或廣度優(yōu)先搜索的思想束倍,解決《200. 島嶼數(shù)量》問題的主要內(nèi)容被丧。主要需要注意的地方是:當(dāng)已經(jīng)搜索的地方,需要及時標(biāo)記绪妹,避免重復(fù)搜索甥桂。


歡迎關(guān)注微信公眾號《書所集錄》

?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
  • 序言:七十年代末,一起剝皮案震驚了整個濱河市邮旷,隨后出現(xiàn)的幾起案子黄选,更是在濱河造成了極大的恐慌,老刑警劉巖婶肩,帶你破解...
    沈念sama閱讀 206,214評論 6 481
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件办陷,死亡現(xiàn)場離奇詭異貌夕,居然都是意外死亡,警方通過查閱死者的電腦和手機懂诗,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 88,307評論 2 382
  • 文/潘曉璐 我一進(jìn)店門蜂嗽,熙熙樓的掌柜王于貴愁眉苦臉地迎上來苗膝,“玉大人殃恒,你說我怎么就攤上這事∪杞遥” “怎么了离唐?”我有些...
    開封第一講書人閱讀 152,543評論 0 341
  • 文/不壞的土叔 我叫張陵,是天一觀的道長问窃。 經(jīng)常有香客問我亥鬓,道長,這世上最難降的妖魔是什么域庇? 我笑而不...
    開封第一講書人閱讀 55,221評論 1 279
  • 正文 為了忘掉前任嵌戈,我火速辦了婚禮,結(jié)果婚禮上听皿,老公的妹妹穿的比我還像新娘熟呛。我一直安慰自己,他們只是感情好尉姨,可當(dāng)我...
    茶點故事閱讀 64,224評論 5 371
  • 文/花漫 我一把揭開白布庵朝。 她就那樣靜靜地躺著,像睡著了一般又厉。 火紅的嫁衣襯著肌膚如雪九府。 梳的紋絲不亂的頭發(fā)上,一...
    開封第一講書人閱讀 49,007評論 1 284
  • 那天覆致,我揣著相機與錄音侄旬,去河邊找鬼。 笑死煌妈,一個胖子當(dāng)著我的面吹牛勾怒,可吹牛的內(nèi)容都是我干的。 我是一名探鬼主播声旺,決...
    沈念sama閱讀 38,313評論 3 399
  • 文/蒼蘭香墨 我猛地睜開眼笔链,長吁一口氣:“原來是場噩夢啊……” “哼!你這毒婦竟也來了腮猖?” 一聲冷哼從身側(cè)響起鉴扫,我...
    開封第一講書人閱讀 36,956評論 0 259
  • 序言:老撾萬榮一對情侶失蹤,失蹤者是張志新(化名)和其女友劉穎澈缺,沒想到半個月后坪创,有當(dāng)?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體炕婶,經(jīng)...
    沈念sama閱讀 43,441評論 1 300
  • 正文 獨居荒郊野嶺守林人離奇死亡,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點故事閱讀 35,925評論 2 323
  • 正文 我和宋清朗相戀三年莱预,在試婚紗的時候發(fā)現(xiàn)自己被綠了柠掂。 大學(xué)時的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片。...
    茶點故事閱讀 38,018評論 1 333
  • 序言:一個原本活蹦亂跳的男人離奇死亡依沮,死狀恐怖涯贞,靈堂內(nèi)的尸體忽然破棺而出,到底是詐尸還是另有隱情危喉,我是刑警寧澤宋渔,帶...
    沈念sama閱讀 33,685評論 4 322
  • 正文 年R本政府宣布,位于F島的核電站辜限,受9級特大地震影響皇拣,放射性物質(zhì)發(fā)生泄漏。R本人自食惡果不足惜薄嫡,卻給世界環(huán)境...
    茶點故事閱讀 39,234評論 3 307
  • 文/蒙蒙 一氧急、第九天 我趴在偏房一處隱蔽的房頂上張望。 院中可真熱鬧毫深,春花似錦吩坝、人聲如沸。這莊子的主人今日做“春日...
    開封第一講書人閱讀 30,240評論 0 19
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽。三九已至鸳址,卻和暖如春瘩蚪,著一層夾襖步出監(jiān)牢的瞬間,已是汗流浹背稿黍。 一陣腳步聲響...
    開封第一講書人閱讀 31,464評論 1 261
  • 我被黑心中介騙來泰國打工疹瘦, 沒想到剛下飛機就差點兒被人妖公主榨干…… 1. 我叫王不留,地道東北人巡球。 一個月前我還...
    沈念sama閱讀 45,467評論 2 352
  • 正文 我出身青樓言沐,卻偏偏與公主長得像,于是被迫代替她去往敵國和親酣栈。 傳聞我的和親對象是個殘疾皇子险胰,可洞房花燭夜當(dāng)晚...
    茶點故事閱讀 42,762評論 2 345

推薦閱讀更多精彩內(nèi)容

  • 題目:給定一個由 '1'(陸地)和 '0'(水)組成的的二維網(wǎng)格,計算島嶼的數(shù)量矿筝。一個島被水包圍起便,并且它是通過水平...
    minningl閱讀 281評論 0 0
  • 1.題目 https://leetcode-cn.com/problems/number-of-islands/ ...
    風(fēng)卷晨沙閱讀 773評論 0 0
  • Time: 2019-08-11 題目描述 給定一個由 '1'(陸地)和 '0'(水)組成的的二維網(wǎng)格,計算島嶼的...
    鋼筆先生閱讀 226評論 0 0
  • 200. 島嶼數(shù)量難度:中題目概述:找到屬于同一個區(qū)域的點,典型的并查集問題榆综。妙痹。題解1:DFS這道題不能采用修改原...
    CrazyShawnLiu閱讀 471評論 0 0
  • 故事梗概:10年前,4個不同專業(yè)的學(xué)生來到綿山鎮(zhèn)青山村中心小學(xué)頂崗支教鼻疮,在這里怯伊,他們有了為期半年的與學(xué)校生活完全不...
    半世閑人閱讀 856評論 2 4