130. Surrounded Regions 被围绕的区域

给定一个二维的矩阵,包含 ‘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),其中 nnnmmm 分别为矩阵的行数和列数。深度优先搜索过程中,每一个点至多只会被标记一次。

  • 空间复杂度:O(n×m)O(n \times m)O(n×m),其中 nnnmmm 分别为矩阵的行数和列数。主要为深度优先搜索的栈的开销。

猜你喜欢

转载自blog.csdn.net/weixin_43336281/article/details/107926795