LeetCode in Python 200. Number of islands (岛屿数量)

发布于:2024-04-20 ⋅ 阅读:(27) ⋅ 点赞:(0)

岛屿数量既可以用深度优先搜索也可以用广度优先搜索解决,本文给出两种方法的代码实现。

示例:

图1 岛屿数量输入输出示意图 

 方法一:广度优先搜索(bfs)

代码:

class Solution:
    def numIslands(self, grid):
        if not grid:
            return 0
        
        rows, cols = len(grid), len(grid[0])
        visit = set()
        islands = 0

        def 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 + dc
                    if 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 += 1
        return 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 = 0
        def dfs(r, c):
            if r not in range(rows) or c not in range(cols) or grid[r][c] == "0":
                return
            grid[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 += 1
        return islands

解释:

1)深度优先搜索相较于广度优先搜索,选择将遍历过的节点的值置为“0”以免重复遍历,同时dfs采用递归方法来实现对四个位置上节点的判断。