1.code
class Solution {
class UnionFind{
int[] parents;
public UnionFind(int totalNodes){
parents = new int[totalNodes];
for(int i=0;i<totalNodes;i++){
parents[i]=i;
}
}
void union(int node1, int node2){
int root1 = find(node1);
int root2 = find(node2);
if(root1!=root2){
parents[root2]=root1;
}
}
int find(int node){
while(parents[node]!=node){
parents[node] = parents[parents[node]];
node = parents[node];
}
return node;
}
boolean isConnect(int node1, int node2){
return find(node1)==find(node2);
}
}
int cols;
public void solve(char[][] board) {
if(board==null||board.length==0){
return;
}
int row = board.length;
int col = board[0].length;
cols = col;
UnionFind uf = new UnionFind(row*col+1);
int spe = row*col;
for(int i=0;i<row;i++){
for(int j=0;j<col;j++){
if(board[i][j]=='O'){
if(i==0||i==row-1||j==0||j==col-1){
uf.union(node(i,j),spe);
}else{
if(i>0&&board[i-1][j]=='O'){
uf.union(node(i,j),node(i-1,j));
}
if(i<row-1&&board[i+1][j]=='O'){
uf.union(node(i,j),node(i+1,j));
}
if(j>0&&board[i][j-1]=='O'){
uf.union(node(i,j),node(i,j-1));
}
if(j<col-1&&board[i][j+1]=='O'){
uf.union(node(i,j),node(i,j+1));
}
}
}
}
}
for(int i=0;i<row;i++){
for(int j=0;j<col;j++){
if(uf.isConnect(node(i,j),spe)){
board[i][j]='O';
}else{
board[i][j]='X';
}
}
}
}
int node(int i,int j){
return i*cols+j;
}
}
2.思路
*给定的二维矩阵中,‘O’字母的位置需要被分成两个大类,一个是与边界‘O’相连通的‘O’,一个是内部被‘X’包围的‘O’,第二种被包围的‘O’也就是需要被替换成‘X’的字母。
*从边界开始寻找,运用并查集int[] parents进行联通性的判断,这里将二维数组board变换成一位数组,运用node(i,j)方法进行转换。
*并查集类里面的union()+find()方法进行元素的联通合并以及根父节点的查找,边界‘O’全部和一个默认的spe元素联通,拥有同样的根节点。
一遍nn的遍历,最后结合并查集类判断board所有元素和spe元素的联通性,将与spe联通的元素全部置位‘O’,其他的全部置位‘X’,即可完成元素的转换操作。