leetccode-130-被围绕的区域
题目描述:

方法一:dfs
class Solution: def solve(self, board: List[List[str]]) -> None: """ Do not return anything, modify board in-place instead. """ if not board or len(board)<=2 or len(board[0])<=2: return row = len(board) col = len(board[0]) def dfs(i,j): if i < 0 or j < 0 or i >= row or j >= col or board[i][j] != 'O': return board[i][j] = '#' dfs(i-1,j) dfs(i+1,j) dfs(i,j+1) dfs(i,j-1) for i in range(row): dfs(i,0) dfs(i,col-1) for j in range(col): dfs(0,j) dfs(row-1,j) for i in range(0, row): for j in range(0, col): if board[i][j] == 'O': board[i][j] = 'X' if board[i][j] == '#': board[i][j] = 'O'
方法二:并查集
class Solution: def solve(self, board: List[List[str]]) -> None: """ Do not return anything, modify board in-place instead. """ f = {} def find(x): f.setdefault(x,x) if f[x]!=x: f[x] = find(f[x]) return f[x] def union(x,y): f[find(y)] = find(x) if not board or not board[0]: return row,col = len(board),len(board[0]) dummy = row*col for i in range(row): for j in range(col): if board[i][j] == "O": if i == 0 or i == row - 1 or j == 0 or j == col - 1: union(i * col + j, dummy) else: for x, y in [(-1, 0), (1, 0), (0, -1), (0, 1)]: if board[i + x][j + y] == "O": union(i * col + j, (i + x) * col + (j + y)) for i in range(row): for j in range(col): if find(dummy) == find(i * col + j): board[i][j] = "O" else: board[i][j] = "X"
浙公网安备 33010602011771号