leetcode_gym/_code/union find/surroundedRegion.py

49 lines
1.2 KiB
Python
Raw Normal View History

from itertools import product
'''
https://leetcode.com/problems/surrounded-regions/discuss/691646/Python-O(mn)-3-colors-dfs-explained
'''
board = [
["X","X","X","X"],
["X","O","O","X"],
["X","X","O","X"],
["X","O","X","X"]
]
class Solution:
def dfs(self, i, j):
if i<0 or j<0 or i>=self.M or j>=self.N or self.board[i][j] != "O":
return
self.board[i][j] = 'T'
neib_list = [[i+1,j],[i-1,j],[i,j-1],[i,j+1]]
for x, y in neib_list:
self.dfs(x, y)
def solve(self, board):
if not board: return 0
self.board, self.M, self.N = board, len(board), len(board[0])
# run dfs on sides
for i in range(0, self.M):
self.dfs(i,0) # left side
self.dfs(i,self.N-1) # right side
# run dfs on top and bottom
for j in range(0, self.N):
self.dfs(0,j) # top
self.dfs(self.M-1,j) # bottom
print(board)
# itertools.product() is equivalent to nested forloop
for i,j in product(range(self.M), range(self.N)):
board[i][j] = "X" if board[i][j] != "T" else "O"
sol = Solution()
sol.solve(board)
print(board)