leetcode 島嶼的個數 python


 
島嶼的個數
 
 

給定一個由 '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         

 










免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM