LeetCode_Surrounded Regions

来源:互联网 发布:阿里云免费架设https 编辑:程序博客网 时间:2024/05/29 15:07

130. Surrounded Regions

一、题目描述

这里写图片描述

题目输入一个X O的矩阵,输出要求被 X 包围的 O 都变成 X。

二、解题思路

这里说下我的思路,看到这道题我先意识到的是边上的 O 都是不变的,同时和边上 O 连接的 O 也是不变的。于是我们想到把同一类的放在一起,于是想到了并查集。具体请看代码注释。

三、java代码

public class Solution {    //disjoint-set 并查集    boolean[] hasEdgeO; //集合上是否有边界上的O    int[] boardSet; //集合 这个结合比较像颗树    public void solve(char[][] board) {        if(board.length==0 || board[0].length==0)            return;        int width = board[0].length, height = board.length;        int boardSize = width*height;         hasEdgeO = new boolean[boardSize];        boardSet = new int[boardSize];        //填充所有的boardSet值 MAKE-SET        for(int i=0;i<boardSize;i++)            boardSet[i] = i;        //hasEdgeO 给边界上的O位置赋Ture,其他赋False值;        for(int j=0;j<boardSize;j++) {            int x = j/width, y = j%width;            hasEdgeO[j] = (board[x][y]=='O' && (x==0||x==height-1||y==0||y==width-1));        }        //开始遍历矩阵board,union每个节点上边和右边相同的节点,用boardSet存储,整型数组存储是这部分的精华!        //注意这里的FIND-SET的过程,是嵌套在UNION-SET中,目的是找到这个集合的根节点,而不是为了去重。        for(int m=0;m<boardSize;m++) {            int x = m/width, y = m%width, up = x - 1, right = y + 1;            //坐标原点在左上角            //right            if(right<width && board[x][y] == board[x][right])                 unionSet(m,m+1);            //top            if(up>=0 && board[x][y] == board[up][y])                unionSet(m,m-width);        }        //改变被X包围的O        for(int n=0;n<boardSize;n++) {            int x = n/width, y = n%width;            if(board[x][y]=='O' && !hasEdgeO[findSet(n)])                board[x][y] = 'X';        }    }    private void unionSet(int x, int y) {        //合并x和y,就是让x的根节点当y的根节点的子节点        //也就是x根节点的索引值对应的值变成y值根节点的值        int rootX = findSet(x);        int rootY = findSet(y);        boardSet[rootX] = rootY;        hasEdgeO[rootY] = hasEdgeO[rootX] || hasEdgeO[rootY]; //让根节点变即可    }    private int findSet(int x) {        if(x == boardSet[x])            return x;        boardSet[x] = findSet(boardSet[x]);        return boardSet[x];    }}

以上只是个人见解,希望多多交流

0 0