题目:
给定一个二维的矩阵,包含 'X' 和 'O'(字母 O)。找到所有被 'X' 围绕的区域,并将这些区域里所有的 'O' 用 'X' 填充。示例:X X X XX O O XX X O XX O X X运行你的函数后,矩阵变为:X X X XX X X XX X X XX 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 = ndef 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:returnif self.rank [i] < self.rank [j]:self.parent[i] = jself.rank [j] += self.rank [i]else:self.parent[j] = iself.rank [i] += self.rank [j]self.count -= 1class 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]:returnm,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+jif 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+iynew_pos=new_i*n+new_jif board[new_i][new_j]=="O":area.union(pos,new_pos)for i in range(m):for j in range(n):pos=i*n+jif area.find(pos)!=m*n:board[i][j]="X"
要点:
1. 用并查集去想,边界肯定连到黑洞区域里(m*n+1),X连到黑洞里即可
那么为了让他们的爹同一,给于黑洞最大的rank,在并查集的地方做个小修改即可
self.rank[-1]=float("inf")
