classSolution: defsolve(self, board: List[List[str]]) -> None: """ Do not return anything, modify board in-place instead. """ f={} deffind(x): f.setdefault(x,x) if x!=f[x]: f[x]=find(f[x]) return f[x] defunion(x,y): f[find(x)]=f[find(y)] row,col=len(board),len(board[0]) inf=row*col
for i in range(row): for j in range(col): if board[i][j]=='O': if i==0or i==row-1or j==0or j==col-1: union(i*col+j,inf) # 收集所有边界O else: for x,y in [(0,1),(0,-1),(1,0),(-1,0)]: if board[i+x][j+y]=='O': union(i*col+j,(i+x)*col+(j+y)) # 连通非边界O for i in range(row): for j in range(col): if find(i*col+j)==find(inf): board[i][j]='O' else: board[i][j]='X'
classSolution: deffindCircleNum(self, isConnected: List[List[int]]) -> int: f={} deffind(x): f.setdefault(x,x) if x!=f[x]: f[x]=find(f[x]) return f[x] defunion(x,y): f[find(x)]=f[find(y)] row,col=len(isConnected),len(isConnected[0]) for i in range(row): for j in range(col): if isConnected[i][j]: union(i,j)
for k in f.keys(): f[k]=find(f[k]) return len(set(f.values()))