返回
原来LeetCode 130题如此简单
前端
2024-01-03 08:44:07
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 算法有一个透彻的理解。通过熟练掌握这些算法,我们可以有效地解决图论问题,并提高我们的编程能力。
常见问题解答
-
DFS 和 BFS 算法有什么区别?
- DFS 是一个递归算法,它深度地探索图的每个分支,而 BFS 是一个迭代算法,它按加入队列的顺序广度优先地探索图。
-
这道题为什么需要使用 DFS 或 BFS 算法?
- 因为我们需要从每个 "O" 单元格出发,探索与其相连的所有 "O" 单元格,以确定它们是否被 "X" 围绕。DFS 和 BFS 算法都能有效地实现这种探索。
-
如何判断一个 "O" 单元格是否被 "X" 围绕?
- 如果一个 "O" 单元格的所有相邻单元格都是 "X",则它被 "X" 围绕。
-
为什么我们需要从边界开始 DFS 或 BFS?
- 因为边界上的 "O" 单元格肯定不会被 "X" 围绕,因此它们可以作为探索的起点。
-
如何标记被 "X" 围绕的 "O" 区域?
- 在遍历完图之后,我们可以检查每个 "O" 单元格是否被访问过。如果它没有被访问过,则它被 "X" 围绕,并应被标记为 "X"。