leetcode130(被围绕的区域)-并查集

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’,即可完成元素的转换操作。

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值