從頂點開始,到其相鄰的一個節點,再由此節點至其相鄰的節點,依次遍歷全部相鄰的節點,直到某個節點相鄰節點所有遍歷完成。數組
注意:spa
狀況1: 網格不存在code
返回:0遞歸
狀況2: 網格爲空(即二維數組爲空數組)leetcode
返回:0get
狀況3: 網格存在且不爲空io
從[0,0]點循環列表,依次將每一個點做爲深度優先遍歷的根節點class
若根節點值爲0,執行下一輪循環import
若根節點值爲1,島數量+1,開始DFSgrid
DFS制定規則爲左右上下
遍歷過的節點值修改成0
題目中直接修改會對原始網格產生影響,因此深拷貝一個副本,不影響原始網格
import copy class Solution: def numIslands(self, grid) -> int: if not grid or not grid[0]: return 0 loc_grid = copy.deepcopy(grid) self.m, self.n = len(loc_grid), len(loc_grid[0]) num = 0 for i in range(self.m): for j in range(self.n): if int(loc_grid[i][j]) == 0: continue num += 1 self.__dfs(loc_grid, i, j) return num def __dfs(self, loc_grid, i, j): if i < 0 or i == self.m or j < 0 or j == self.n: return if int(loc_grid[i][j]) == 0: return loc_grid[i][j] = 0 self.__dfs(loc_grid, i, j-1) self.__dfs(loc_grid, i, j+1) self.__dfs(loc_grid, i-1, j) self.__dfs(loc_grid, i+1, j)
用了深拷貝是由於直接丟進去原矩陣會致使原矩陣被修改,若是隻是作題的話能夠不考慮這點,速度和空間都會有所提高。