并查集
public class Solution {
//并查集
private static class UnionFind{
int[] parents;
UnionFind(int size){
parents = new int[size];
//并查集数组初始化
for(int i = 0; i < size; i++){
parents[i] = i;
}
}
public int find(int x){
int r = x;
while(parents[r] != r){
r = parents[r];
}
return r;
}
public void union(int x, int y){
int fx = find(x);
int fy = find(y);
if(fx == fy){
return;
}
parents[fx] = fy;
}
public boolean isConnect(int x, int y){
return find(x) == find(y);
}
}
public void solve(char[][] board) {
int m = board.length;
if(m == 0){
return ;
}
int n = board[0].length;
//引入虚拟节点,是所有边缘0节点的父节点 序号为 m*n
int dummy = m * n;
UnionFind uf = new UnionFind(m * n + 1);
for(int i = 0; i < m; i++){
for(int j = 0; j < n; j++){
if(board[i][j] == 'O'){
if(i == 0 || i == m - 1 || j == 0 || j == n - 1){//边缘的 O
uf.union(i * n + j, dummy);
}else{//非边缘的o
if(i > 0 && board[i - 1][j] == 'O'){
uf.union(i * n + j, (i-1) * n + j);
}
if(i < m - 1 && board[i + 1][j] =='O'){
uf.union(i * n + j, (i+1) * n + j);
}
if(j > 0 && board[i][j - 1] =='O'){
uf.union(i * n + j, i * n + (j - 1));
}
if(j < n - 1 && board[i][j + 1] =='O'){
uf.union(i * n + j, i * n + (j + 1));
}
}
}
}
}
for (int i = 0; i < m; i++) {
for (int j = 0; j < n; j++) {
if (uf.isConnect(i * n + j, dummy)) {
// 和dummy 在一个连通区域的,那么就是O
board[i][j] = 'O';
} else {
board[i][j] = 'X';
}
}
}
}
}