题目:
给定一个二维的矩阵,包含 '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
来源:力扣(LeetCode)
链接:https://leetcode-cn.com/problems/surrounded-regions
著作权归领扣网络所有。商业转载请联系官方授权,非商业转载请注明出处。
答案:
时间:
15min,pos算错了
class UnionFind:
def __init__(self,n):
self.parent = [i for i in range(n)]
self.rank = [1 for _ in range(n)]
self.rank[-1]=float("inf")
self.count = n
def find(self,p):
while self.parent[p] != self.parent[self.parent[p]]:
self.parent[p] = self.parent[self.parent[p]]
return self.parent[p]
def union(self,p,q):
i = self.find(p)
j = self.find(q)
if i == j:
return
if self.rank [i] < self.rank [j]:
self.parent[i] = j
self.rank [j] += self.rank [i]
else:
self.parent[j] = i
self.rank [i] += self.rank [j]
self.count -= 1
class Solution:
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])
area=UnionFind(m*n+1)
directs=[(1,0),(-1,0),(0,1),(0,-1)]
for i in range(m):
for j in range(n):
pos=i*n+j
if board[i][j]=="X":area.union(pos,m*n)
else:
if i==0 or j==0 or j==n-1 or i==m-1:area.union(pos,m*n)
else:
for ix,iy in directs:
new_i,new_j=i+ix,j+iy
new_pos=new_i*n+new_j
if board[new_i][new_j]=="O":
area.union(pos,new_pos)
for i in range(m):
for j in range(n):
pos=i*n+j
if area.find(pos)!=m*n:
board[i][j]="X"
要点:
1. 用并查集去想,边界肯定连到黑洞区域里(m*n+1),X连到黑洞里即可
那么为了让他们的爹同一,给于黑洞最大的rank,在并查集的地方做个小修改即可
self.rank[-1]=float("inf")