• LeetCode_Surrounded Regions


    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];
        }
    }

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

  • 相关阅读:
    大规模分布式存储系统笔记一二章 概述与单机存储系统
    Apache Avro总结
    可汗学院公开课统计学笔记 第11到16集 样本 总体 方差 标准差 诸方差公式
    可汗学院公开课统计学笔记 第1到10集 均值 中位数 众数 极差 统计图
    Mock、Powermock使用汇总
    如何解决NoSuchMethodError
    2019年我看手机之华为篇
    活着
    log4j使用指北
    关于Eclipse导入maven项目报空指针异常
  • 原文地址:https://www.cnblogs.com/liguangsunls/p/7250687.html
Copyright © 2020-2023  润新知