島嶼的個數
給定一個由 '1'
(陸地)和 '0'
(水)組成的的二維網格,計算島嶼的數量。一個島被水包圍,並且它是通過水平方向或垂直方向上相鄰的陸地連接而成的。你可以假設網格的四個邊均被水包圍。
示例 1:
輸入:
11110
11010
11000
00000
輸出: 1
示例 2:
輸入: 11000 11000 00100 00011 輸出: 3

我的思想:
輸入是一個二維數組,"0" 代表是水 "1"代表是陸地 (注意里面存的是字符串,很坑 我調了半天才發現)
從左上角(0, 0)開始 遍歷所有位置 一直到右下角 (m, n), 這個過程中
如果發現當前位置是"1", 先把這個位置標記為查詢過,
然后遞歸查看當前位置的上下左右四個位置,把是"1"的標記遍歷過,再查看這個位置的上下左右
實際上是一個循環 套了一個遞歸來實現。
當發現一個陸地 就計數器自增1 然后和這個陸地相連的所有陸地都標記為已經查找過
小技巧:
遍歷圖的時候,邊界位置要留意,左邊沒有左側,上邊沒有上側,右邊沒有右側,下邊沒有下側,
可以寫分支判斷如果是邊界就不遍歷外側。
我選擇的辦法是,在圖的外側增加一圈"0", 相當於擴大了整個圖,
這樣在遞歸陸地的過程中會節省了判斷,並且不用考慮超出范圍的問題。
python代碼:
1 class Solution: 2 def numIslands(self, grid): 3 """
4 :type grid: List[List[str]] 5 :rtype: int 6 """
7 # 如果是空圖 返回沒有陸地
8 if not grid: 9 return 0 10 # 把原圖改變一下 四周加上一圈"0" 防止出界 方便遍歷
11 w, h = len(grid[0]), len(grid) 12 new_grid = [["0" for i in range(w + 2)]] 13 for g in grid: 14 new_grid.append(["0"] + g + ["0"]) 15 new_grid.append(["0" for i in range(w + 2)]) 16
17 num = 0 # 記錄陸地數量
18
19 # 遍歷除了周圍的"0" 中間的部分
20 for i in range(1, h+1): 21 for j in range(1, w+1): 22 if new_grid[i][j] == "1": # 如果是陸地 就進入深度遍歷
23 num += 1
24 self.deep_search(i, j, new_grid) 25
26 return num 27
28
29 def deep_search(self, i, j, grid): 30 """如果當前是陸地,把當前結點標記遍歷過,並分別看左右上下四個位置"""
31 if grid[i][j] == "0": 32 return
33 grid[i][j] = "0"
34 self.deep_search(i-1,j,grid) 35 self.deep_search(i,j-1,grid) 36 self.deep_search(i,j+1,grid) 37 self.deep_search(i+1,j,grid) 38