返回

原来LeetCode 130题如此简单

前端

LeetCode 130 题:探索被 X 围绕的 O 区域

简介

LeetCode 130 题是一道经典的面试题,考验了深度优先搜索 (DFS) 和广度优先搜索 (BFS) 算法的应用。这道题旨在于找出由字符 "X" 围绕的 "O" 区域,并将这些 "O" 区域填充为 "X"。

算法选择

解决这道题有多种方法,但 DFS 和 BFS 是最常用的两种算法。

DFS 算法

DFS 算法通过递归地探索图中的每个节点来工作。在该问题中,图是由矩阵中的单元格表示的,而边是由相邻单元格之间的连接表示的。DFS 算法从一个未访问的 "O" 单元格开始,并递归地探索其未访问的相邻单元格。如果一个单元格的周围全是 "X",则它属于被 "X" 围绕的 "O" 区域,并被标记为 "X"。

BFS 算法

BFS 算法通过将每个节点加入队列来工作,然后按加入顺序依次处理它们。在该问题中,BFS 算法从一个未访问的 "O" 单元格开始,并将它加入队列。然后,它将队列中第一个单元格的未访问的相邻单元格加入队列。如果一个单元格的周围全是 "X",则它属于被 "X" 围绕的 "O" 区域,并被标记为 "X"。

代码示例

下面是使用 Python 实现的 DFS 算法的代码示例:

def solve(board):
    if not board:
        return

    m, n = len(board), len(board[0])
    visited = [[False] * n for _ in range(m)]

    def dfs(x, y):
        if x < 0 or x >= m or y < 0 or y >= n or board[x][y] != 'O' or visited[x][y]:
            return
        visited[x][y] = True
        dfs(x + 1, y)
        dfs(x - 1, y)
        dfs(x, y + 1)
        dfs(x, y - 1)

    # 从边界开始 DFS
    for i in range(m):
        if board[i][0] == 'O' and not visited[i][0]:
            dfs(i, 0)
        if board[i][n - 1] == 'O' and not visited[i][n - 1]:
            dfs(i, n - 1)

    for j in range(n):
        if board[0][j] == 'O' and not visited[0][j]:
            dfs(0, j)
        if board[m - 1][j] == 'O' and not visited[m - 1][j]:
            dfs(m - 1, j)

    # 标记被 "X" 围绕的 "O" 区域
    for i in range(m):
        for j in range(n):
            if board[i][j] == 'O' and not visited[i][j]:
                board[i][j] = 'X'

结语

LeetCode 130 题是一道具有挑战性的算法题,它需要我们对 DFS 和 BFS 算法有一个透彻的理解。通过熟练掌握这些算法,我们可以有效地解决图论问题,并提高我们的编程能力。

常见问题解答

  1. DFS 和 BFS 算法有什么区别?

    • DFS 是一个递归算法,它深度地探索图的每个分支,而 BFS 是一个迭代算法,它按加入队列的顺序广度优先地探索图。
  2. 这道题为什么需要使用 DFS 或 BFS 算法?

    • 因为我们需要从每个 "O" 单元格出发,探索与其相连的所有 "O" 单元格,以确定它们是否被 "X" 围绕。DFS 和 BFS 算法都能有效地实现这种探索。
  3. 如何判断一个 "O" 单元格是否被 "X" 围绕?

    • 如果一个 "O" 单元格的所有相邻单元格都是 "X",则它被 "X" 围绕。
  4. 为什么我们需要从边界开始 DFS 或 BFS?

    • 因为边界上的 "O" 单元格肯定不会被 "X" 围绕,因此它们可以作为探索的起点。
  5. 如何标记被 "X" 围绕的 "O" 区域?

    • 在遍历完图之后,我们可以检查每个 "O" 单元格是否被访问过。如果它没有被访问过,则它被 "X" 围绕,并应被标记为 "X"。