从顶点开始,到其相邻的一个节点,再由此节点至其相邻的节点,依次遍历全部相邻的节点,直到某个节点相邻节点所有遍历完成。数组
注意: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)
用了深拷贝是由于直接丢进去原矩阵会致使原矩阵被修改,若是只是作题的话能够不考虑这点,速度和空间都会有所提高。