200. 岛屿数量
200. 岛屿数量 给你一个由 '1'(陆地)和 '0'(水)组成的的二维网格,请你计算网格中岛屿的数量。 岛屿总是被水包围,并且每座岛屿只能由水平方向或竖直方向上相邻的陆地连接形成。 此外,你可以假设该网格的四条边均被水包围。 示例 1: 输入: [ ['1','1','1','1','0'], ['1','1','0','1','0'], ['1','1','0','0','0'], ['0','0','0','0','0'] ] 输出: 1 示例 2: 输入: [ ['1','1','0','0','0'], ['1','1','0','0','0'], ['0','0','1','0','0'], ['0','0','0','1','1'] ] 输出: 3 解释: 每座岛屿只能由水平和/或竖直方向上相邻的陆地连接而成。
审题:上下左右是1,则就是连在一起的岛屿
分析:
(1)DFS
思路:将二维网格看成一个无向图,竖直或水平相邻的1之间有边
线性扫描所有二维网格,如果该位置为1,则以此位置为根节点,DFS;res += 1
DFS:当前位置(节点)已被访问过,因此置为0,再遍历上下左右四个位置,如果为1,则继续调用DFS
复杂度分析:
time:O(M*N) 行列,因为:遍历所有元素,每个最多遍历两次 (从上和左)
space:O(MN) 最坏就是所有网格都是陆地,深度优先搜索深度为 MN
class Solution(object): def numIslands(self, grid): """ :type grid: List[List[str]] :rtype: int """ res = 0 for i in range(len(grid)): for j in range(len(grid[0])): # 遍历所有网格 if grid[i][j] == "1": # 如果位置为1,则以此位置为起点,深度优先遍历 self.dfs(grid, i, j) # 岛屿数+1 res += 1 return res def dfs(self, grid, i, j): # 当前位置已被遍历过,置为0 grid[i][j] = '0' # 遍历上下左右四个位置,如果位置为1,则以此位置为起点,深度优先遍历 if i - 1 >= 0 and grid[i - 1][j] == '1': self.dfs(grid, i - 1, j) if i + 1 < len(grid) and grid[i + 1][j] == '1': self.dfs(grid, i + 1, j) if j - 1 >= 0 and grid[i][j - 1] == '1': self.dfs(grid, i, j - 1) if j + 1 < len(grid[0]) and grid[i][j + 1] == "1": self.dfs(grid, i, j + 1)
动画不错:
https://leetcode-cn.com/problems/number-of-islands/solution/dfs-bfs-bing-cha-ji-python-dai-ma-java-dai-ma-by-l/