题目:

Given a 2D board containing 'X' and 'O', capture all regions surrounded by 'X'.

A region is captured by flipping all 'O's into 'X's in that surrounded region.

For example,

X X X X
X O O X
X X O X
X O X X

After running your function, the board should be:

X X X X
X X X X
X X X X
X O X X

链接:   http://leetcode.com/problems/surrounded-regions/

题解:

第一思路是从四条边的'O'开始做BFS,类似查找Connected Components或者图像处理里面的Region Grow。把找到的'O'标记为一个特殊符号比如'1'之类的。BFS结束后scan整个矩阵,把剩下的'O'变成'X','1'变回'O'。

Time Complexity - O(mn), Space Complexity - O(mn)

public class Solution {
public void solve(char[][] board) {
if(board == null || board.length == 0)
return;
Queue<Node> q = new LinkedList<>(); for(int i = 0; i < board.length; i++) // first col
if(board[i][0] == 'O')
q.offer(new Node(i, 0)); for(int i = 0; i < board.length; i++) // last col
if(board[i][board[0].length - 1] == 'O')
q.offer(new Node(i, board[0].length - 1)); for(int i = 1; i < board[0].length - 1; i++) // first row
if(board[0][i] == 'O')
q.offer(new Node(0, i)); for(int i = 1; i < board[0].length - 1; i++) // last row
if(board[board.length - 1][i] == 'O')
q.offer(new Node(board.length - 1, i)); while(!q.isEmpty()) {
Node curNode = q.poll();
if(curNode.row < 0 || curNode.row >= board.length || curNode.col >= board[0].length || curNode.col < 0)
continue;
if(board[curNode.row][curNode.col] != 'O')
continue;
board[curNode.row][curNode.col] = '|';
q.offer(new Node(curNode.row - 1, curNode.col));
q.offer(new Node(curNode.row + 1, curNode.col));
q.offer(new Node(curNode.row, curNode.col + 1));
q.offer(new Node(curNode.row, curNode.col - 1));
} for(int i = 0; i < board.length; i++)
for(int j = 0; j < board[0].length; j++)
if(board[i][j] == 'O')
board[i][j] = 'X'; for(int i = 0; i < board.length; i++)
for(int j = 0; j < board[0].length; j++)
if(board[i][j] == '|')
board[i][j] = 'O';
} private class Node {
public int row;
public int col;
public Node(int i, int j) {
this.row = i;
this.col = j;
}
}
}

代码有些长,有空一定要看一看discuss版简洁的解法,再来更新。 (看了一下好像大家写得也都比较长...算了先不更新了,Reference里的文章跟我的解法一样,不过说明更详细准备,挺好的)。

题外话: 今天Work from home去洗牙,洗完牙以后医生说你最里面的大牙蛀了,裂了一条缝,需要补。长这么大第一次蛀牙,前些天总觉得不舒服,勤刷牙也无济于事。赶紧跟医生约好下周去补,拖延的话也许就要根管了。之后去Costco买了葡萄苹果和香蕉,家里还有三个桃子,可以靠吃水果度日。

中午两点的时候兴业银行电面,法国人问了一些基本的OO问题,还有SQL问题,20多分钟就结束了,感觉双方兴趣都不大...对这些银行,我要奉行不主动,不拒绝,他们有兴趣我就面,就当熟悉简历和练口语了。

二刷:

重新写了一下,要先建立一个Node来保存坐标。然后使用一个Queue来对Node进行BFS。下面的写法里面有不少多余的计算,需要进一步好好剪枝。

Java:

Time Complexity - O(4mn), Space Complexity - O(4mn)

public class Solution {
public void solve(char[][] board) { // BFS
if (board == null || board.length == 0) return;
Queue<Node> q = new LinkedList<>();
int rowNum = board.length;
int colNum = board[0].length;
for (int i = 0; i < board.length; i++) {
if (board[i][0] == 'O') q.offer(new Node(i, 0));
if (board[i][colNum - 1] == 'O') q.offer(new Node(i, colNum - 1));
}
for (int j = 0; j < board[0].length; j++) {
if (board[0][j] == 'O') q.offer(new Node(0, j));
if (board[rowNum - 1][j] == 'O') q.offer(new Node(rowNum - 1, j));
} while (!q.isEmpty()) {
Node node = q.poll();
int i = node.row, j = node.col;
if (board[i][j] != 'O') continue;
board[i][j] = '|';
if (i - 1 >= 0 && board[i - 1][j] == 'O') q.offer(new Node(i - 1, j));
if (i + 1 <= rowNum - 1 && board[i + 1][j] == 'O') q.offer(new Node(i + 1, j));
if (j - 1 >= 0 && board[i][j - 1] == 'O') q.offer(new Node(i, j - 1));
if (j + 1 <= colNum - 1 && board[i][j + 1] == 'O') q.offer(new Node(i, j + 1));
} for (int i = 0; i < rowNum; i++) {
for (int j = 0; j < colNum; j++) {
if (board[i][j] == 'O') board[i][j] = 'X';
}
}
for (int i = 0; i < rowNum; i++) {
for (int j = 0; j < colNum; j++) {
if (board[i][j] == '|') board[i][j] = 'O';
}
}
} private class Node {
int row;
int col; public Node(int i, int j) {
this.row = i;
this.col = j;
}
}
}

三刷:

依然使用了BFS,简化了一下。速度仍然不是很快,大约9ms左右。需要进一步优化,或者尝试Union-Find和DFS。

Java:

Time Complexity - O(mn), Space Complexity - O(mn)

public class Solution {
public void solve(char[][] board) { // BFS
if (board == null || board.length == 0) return;
Queue<int[]> q = new LinkedList<>();
int rowNum = board.length;
int colNum = board[0].length;
for (int i = 0; i < rowNum; i++) {
if (board[i][0] == 'O') q.offer(new int[] {i, 0});
if (board[i][colNum - 1] == 'O') q.offer(new int[] {i, colNum - 1});
}
for (int j = 1; j < colNum - 1; j++) {
if (board[0][j] == 'O') q.offer(new int[] {0, j});
if (board[rowNum - 1][j] == 'O') q.offer(new int[] {rowNum - 1, j});
} while (!q.isEmpty()) {
int[] node = q.poll();
int i = node[0], j = node[1];
if (board[i][j] != 'O') continue;
board[i][j] = '|';
if (i - 1 >= 0 && board[i - 1][j] == 'O') q.offer(new int[] {i - 1, j});
if (i + 1 <= rowNum - 1 && board[i + 1][j] == 'O') q.offer(new int[] {i + 1, j});
if (j - 1 >= 0 && board[i][j - 1] == 'O') q.offer(new int[] {i, j - 1});
if (j + 1 <= colNum - 1 && board[i][j + 1] == 'O') q.offer(new int[] {i, j + 1});
} for (int i = 0; i < rowNum; i++) {
for (int j = 0; j < colNum; j++) {
if (board[i][j] == 'O') board[i][j] = 'X';
}
}
for (int i = 0; i < rowNum; i++) {
for (int j = 0; j < colNum; j++) {
if (board[i][j] == '|') board[i][j] = 'O';
}
}
}
}

Reference:

https://leetcode.com/discuss/19805/my-java-o-n-2-accepted-solution

https://leetcode.com/discuss/97838/share-my-4ms-improved-solution-beats-99-5%25

https://leetcode.com/discuss/42445/a-really-simple-and-readable-c-solution%EF%BC%8Conly-cost-12ms

https://leetcode.com/discuss/6285/solve-it-using-union-find

https://leetcode.com/discuss/45746/9-lines-python-148-ms

130. Surrounded Regions的更多相关文章

  1. leetcode 200. Number of Islands 、694 Number of Distinct Islands 、695. Max Area of Island 、130. Surrounded Regions

    两种方式处理已经访问过的节点:一种是用visited存储已经访问过的1:另一种是通过改变原始数值的值,比如将1改成-1,这样小于等于0的都会停止. Number of Islands 用了第一种方式, ...

  2. 130. Surrounded Regions(M)

    130.Add to List 130. Surrounded Regions Given a 2D board containing 'X' and 'O' (the letter O), capt ...

  3. [LeetCode] 130. Surrounded Regions 包围区域

    Given a 2D board containing 'X' and 'O'(the letter O), capture all regions surrounded by 'X'. A regi ...

  4. 【LeetCode】130. Surrounded Regions (2 solutions)

    Surrounded Regions Given a 2D board containing 'X' and 'O', capture all regions surrounded by 'X'. A ...

  5. Leetcode 130. Surrounded Regions

    Given a 2D board containing 'X' and 'O' (the letter O), capture all regions surrounded by 'X'. A reg ...

  6. 130. Surrounded Regions -- 被某字符包围的区域

    Given a 2D board containing 'X' and 'O', capture all regions surrounded by 'X'. A region is captured ...

  7. 【一天一道LeetCode】#130. Surrounded Regions

    一天一道LeetCode 本系列文章已全部上传至我的github,地址:ZeeCoder's Github 欢迎大家关注我的新浪微博,我的新浪微博 欢迎转载,转载请注明出处 (一)题目 Given a ...

  8. 130. Surrounded Regions (Graph; DFS)

    Given a 2D board containing 'X' and 'O', capture all regions surrounded by 'X'. A region is captured ...

  9. 130. Surrounded Regions(周围区域问题 广度优先)(代码未完成!!)

    Given a 2D board containing 'X' and 'O' (the letter O), capture all regions surrounded by 'X'. A reg ...

随机推荐

  1. .Net Core 项目中的包引用探索(使用VSCode)

    本文组织有点乱,先说结论吧: 1 在 project.json 文件中声明包引用. 而不是像以前那样可以直接引用 dll. 2 使用 dotnet restore 命令后,nuget 会把声明的依赖项 ...

  2. C#中调用unmanaged DLL

    using System; using System.Collections.Generic; using System.ComponentModel; using System.Data; usin ...

  3. MDM基于IOS设备管控功能的所有命令介绍

    前面我们介绍了IOS上MDM几个简单的控制命令的发送和返回数据的解析处理,下面我们介绍一下MDM涉及到的命令的操作介绍: 一.Control Commands(控制类命令) 1.Device Lock ...

  4. JS滑动门,JQuery滑动门

    <a href="#" id="one1" onmouseover="setTab('one',1,2)" class="h ...

  5. 在Tomcat中部署Java Web应用程序

    在Tomcat中部署Java Web应用程序有两种方式:静态部署和动态部署.在下文中$CATALINA_HOME指的是Tomcat根目录. 一.静态部署      静态部署指的是我们在服务器启动之前部 ...

  6. 使用CSS修改HTML5 input placeholder颜色( 转载 )

    问题:Chrome支持input=[type=text]占位文本属性,但下列CSS样式却不起作用: input[placeholder], [placeholder], *[placeholder] ...

  7. CLR via C# 异常管理读书笔记

    1. 设计异常类型层次结构应该浅而宽 2. 注意使用finally块清理资源 3. 不要什么都捕捉 4.得体地从异常中恢复 5.发生不可恢复的异常时回滚部分完成的操作-维持状态 6.隐藏实现细节来维系 ...

  8. java-----基本数据类型包装类

    目的:为了方便操作基本数据类型值,将其封装为对象,在对象定义了属性和行为,丰富了改数据的操作,用于描述该对象的类也就成为基本数据类型对象包装类. 例如:int类型的取值范围:Integer------ ...

  9. db2使用Java存储过程实现MD5函数

    1.数据库版本 2.Java脚本 import java.security.MessageDigest; import COM.ibm.db2.app.UDF; public class MD5UDF ...

  10. K2 Blackpearl 4.6.8 安装步骤详解

    由于某些原因,我幼小的心灵受到了很大的创伤,倍感世态之炎凉,久久不能愈合,也因此很久没再接触K2 Blackpearl了.偶然来了兴趣,想整个K2的环境,闲暇之余了解其新功能,温故知新,也希望从中能讨 ...