LeetCode_Surrounded Regions
2015-08-22 04:57
357 查看
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]; } }
以上只是个人见解,希望多多交流
相关文章推荐
- Atom编辑器折腾记_(15)JS代码片段补全(插件:javascript-snippets)
- Atom编辑器折腾记_(15)JS代码片段补全(插件:javascript-snippets)
- 在交互式shell脚本中创建对话框
- Atom编辑器折腾记_(14)JQ代码片段补全(插件:Jquery-snippets)
- Atom编辑器折腾记_(14)JQ代码片段补全(插件:Jquery-snippets)
- LeetCode Reverse Linked List
- Leetcode_Palindrome Partitioning II
- LeetCode Reverse Linked List
- [LeetCode#47]Permutations II
- shell脚本中一些特殊符号
- 使用wget 命令下载JDK的方法
- 操作队列
- XPath入门教程
- NGUI的代码控制
- 跳台阶解析【剑指Offer】
- uva11992区间修改线段树
- Mybatis 中 if test字符串比较问题
- android 比较靠谱的图片压缩
- mybatis动态SQL语句
- Mybatis的if test字符串比较问题