岛屿数量既可以用深度优先搜索也可以用广度优先搜索解决,本文给出两种方法的代码实现。
示例:
图1 岛屿数量输入输出示意图
方法一:广度优先搜索(bfs)
代码:
class Solution:def numIslands(self, grid):if not grid:return 0rows, cols = len(grid), len(grid[0])visit = set()islands = 0def bfs(r, c):que = deque()que.append((r, c))visit.add((r, c))while que:row, col = que.popleft()directions = [[1, 0], [-1, 0], [0, 1], [0, -1]]for dr, dc in directions:r, c = row + dr, col + dcif r in range(rows) and c in range(cols) and grid[r][c] == "1" and (r, c) not in visit:que.append((r, c))visit.add((r, c))for r in range(rows):for c in range(cols):if grid[r][c] == "1" and (r, c) not in visit:bfs(r, c)islands += 1return islands
解释:
1)visit记录所有已经遍历的位置集合,如果该位置值为1且还未遍历到,则对该位置进行bfs,并增加一块岛屿数量。bfs中设置了一个队列que用于记录需要遍历的节点,directions为每个节点需要遍历的四个方向,分别对应右、左、上、下。对每个位置进行判断,如果该位置未越界、值为1且未被遍历到,则将该结点加入即将需要遍历的节点队列中,并将其放入已经遍历的节点集合中。
方法二:深度优先搜索(dfs)
代码:
class Solution:def numIslands(self, grid):if not grid:return 0 rows, cols = len(grid), len(grid[0])islands = 0def dfs(r, c):if r not in range(rows) or c not in range(cols) or grid[r][c] == "0":returngrid[r][c] = "0"dfs(r + 1, c)dfs(r - 1, c)dfs(r, c + 1)dfs(r, c - 1)for r in range(rows):for c in range(cols):if grid[r][c] == "1":dfs(r, c)islands += 1return islands
解释:
1)深度优先搜索相较于广度优先搜索,选择将遍历过的节点的值置为“0”以免重复遍历,同时dfs采用递归方法来实现对四个位置上节点的判断。