Surrounded Regions 解答
Question
Given a 2D board containing 'X' and 'O' (the letter O), capture all regions surrounded by 'X'.
A region is captured by flipping all 'O's into 'X's in that surrounded region.
Example:
X X X X X O O X X X O X X O X X
After running your function, the board should be:
X X X X X X X X X X X X X O X X
Explanation:
Surrounded regions shouldn’t be on the border, which means that any 'O' on the border of the board are not flipped to 'X'. Any 'O' that is not on the border and it is not connected to an 'O' on the border will be flipped to 'X'. Two cells are connected if they are adjacent cells connected horizontally or vertically.
Solution
基本思路是两次遍历矩阵。第一次从边界上的'O'入手,通过BFS或DFS找到所有和它连接的'O'点,把它们暂时设为另一个字符,比如'$'。第二次遍历矩阵时,剩下的'O'翻转为'X','$'翻转为'O'.
时间复杂度为O(m*n)
DFS
class Solution: def dfs(self, board: List[List[str]], row: int, column: int) -> None: m, n = len(board), len(board[0]) if row < 0 or row >= m or column < 0 or column >= n: return if board[row][column] != 'O': return board[row][column] = '$' self.dfs(board, row - 1, column) self.dfs(board, row + 1, column) self.dfs(board, row, column - 1) self.dfs(board, row, column + 1) def solve(self, board: List[List[str]]) -> None: """ Do not return anything, modify board in-place instead. """ if not board or not board[0]: return m, n = len(board), len(board[0]) # DFS for i in range(n): if board[0][i] == 'O': self.dfs(board, 0, i) if board[m - 1][i] == 'O': self.dfs(board, m - 1, i) for i in range(m): if board[i][0] == 'O': self.dfs(board, i, 0) if board[i][n - 1] == 'O': self.dfs(board, i, n - 1) # second traverse for i in range(m): for j in range(n): if board[i][j] == 'O': board[i][j] = 'X' if board[i][j] == '$': board[i][j] = 'O'
BFS
from collections import deque class Solution: def bfs(self, board: List[List[str]], row: int, column: int) -> None: m, n = len(board), len(board[0]) if row < 0 or row >= m or column < 0 or column >= n: return if board[row][column] != 'O': return board[row][column] = '$' level = deque([(row, column),]) while level: L = len(level) for i in range(L): curr_row, curr_column = level.popleft() if 0 <= curr_row - 1 < m and board[curr_row - 1][curr_column] == 'O': board[curr_row - 1][curr_column] = '$' level.append((curr_row - 1, curr_column)) if 0 <= curr_row + 1 < m and board[curr_row + 1][curr_column] == 'O': board[curr_row + 1][curr_column] = '$' level.append((curr_row + 1, curr_column)) if 0 <= curr_column - 1 < n and board[curr_row][curr_column - 1] == 'O': board[curr_row][curr_column - 1] = '$' level.append((curr_row, curr_column - 1)) if 0 <= curr_column + 1 < n and board[curr_row][curr_column + 1] == 'O': board[curr_row][curr_column + 1] = '$' level.append((curr_row, curr_column + 1)) def solve(self, board: List[List[str]]) -> None: """ Do not return anything, modify board in-place instead. """ if not board or not board[0]: return m, n = len(board), len(board[0]) # BFS for i in range(n): if board[0][i] == 'O': self.bfs(board, 0, i) if board[m - 1][i] == 'O': self.bfs(board, m - 1, i) for i in range(m): if board[i][0] == 'O': self.bfs(board, i, 0) if board[i][n - 1] == 'O': self.bfs(board, i, n - 1) # second traverse for i in range(m): for j in range(n): if board[i][j] == 'O': board[i][j] = 'X' if board[i][j] == '$': board[i][j] = 'O'

浙公网安备 33010602011771号