给定一个二维的矩阵,包含 ‘X’ 和 ‘O’(字母 O)。
找到所有被 ‘X’ 围绕的区域,并将这些区域里所有的 ‘O’ 用 ‘X’ 填充。
示例:
X X X X
X O O X
X X O X
X O X X
运行你的函数后,矩阵变为:
X X X X
X X X X
X X X X
X O X X
解释:
被围绕的区间不会存在于边界上,换句话说,任何边界上的 ‘O’ 都不会被填充为 ‘X’。 任何不在边界上,或不与边界上的 ‘O’ 相连的 ‘O’ 最终都会被填充为 ‘X’。如果两个元素在水平或垂直方向相邻,则称它们是“相连”的。
DFS
所有的不被包围的 O 都直接或间接与边界上的 O 相连。
- 对于每一个边界上的
O
,我们以它为起点,标记所有与它直接或间接相连的字母O
; - 最后我们遍历这个矩阵,对于每一个字母:
- 如果该字母被标记过,则该字母为没有被字母
X
包围的字母O
,我们将其还原为字母O
; - 如果该字母没有被标记过,则该字母为被字母
X
包围的字母O
,我们将其修改为字母X
。
- 如果该字母被标记过,则该字母为没有被字母
Code
def solve(self, board: List[List[str]]) -> None:
"""
Do not return anything, modify board in-place instead.
"""
if not board:
return
def dfs(x, y):
if not 0 <= x < rows or not 0 <= y < cols or board[x][y] != 'O':
return
board[x][y] = 'V'
dfs(x + 1, y)
dfs(x - 1, y)
dfs(x, y + 1)
dfs(x, y - 1)
rows, cols = len(board), len(board[0])
for r in range(rows):
dfs(r, 0)
dfs(r, cols - 1)
for c in range(1, cols - 1):
dfs(0, c)
dfs(rows - 1, c)
for r in range(rows):
for c in range(cols):
if board[r][c] == 'V':
board[r][c] = 'O'
elif board[r][c] == 'O':
board[r][c] = 'X'
复杂度分析
-
时间复杂度:O(n×m)O(n \times m)O(n×m),其中 nnn 和 mmm 分别为矩阵的行数和列数。深度优先搜索过程中,每一个点至多只会被标记一次。
-
空间复杂度:O(n×m)O(n \times m)O(n×m),其中 nnn 和 mmm 分别为矩阵的行数和列数。主要为深度优先搜索的栈的开销。