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

题解:用的BFS。

最外围的O肯定是没法变成X的,把这些O推进一个队列里面,然后从它们开始上下左右进行广度优先搜索,它们周围的O也是不用变成X的(因为它有一条突围出去的都是O的路径),然后从周围的点继续广搜......

实现细节:

  • 用一个visited二维数组记录某个O是否已经进过队列了,这样就不会死循环;
  • 另一个二维数组isX记录哪些点不用变成X,在BFS结束后,把要变成X的点都变成X;
  • 题目中X和O都是大写的=。=

实现代码如下:

 public class Solution {
class co{
int x;
int y;
public co(int x,int y){
this.x = x;
this.y = y;
}
}
public void solve(char[][] board) {
if(board == null || board.length == 0)
return;
int m = board.length;
int n = board[0].length;
boolean[][] visited = new boolean[m][n];
boolean[][] isX = new boolean[m][n];
for(boolean[] row:isX)
Arrays.fill(row, true);
//put all o's cordinates into queue
Queue<co> queue = new LinkedList<co>(); //first line and last line
for(int i = 0;i < n;i++)
{
if(board[0][i]=='O'){
queue.add(new co(0, i));
visited[0][i]= true;
isX[0][i]= false;
}
if(board[m-1][i]=='O'){
queue.add(new co(m-1, i));
visited[m-1][i]= true;
isX[m-1][i]= false;
}
} //first and last column
for(int j = 0;j<m;j++){
if(board[j][0]=='O'){
queue.add(new co(j, 0));
visited[j][0]= true;
isX[j][0]= false;
}
if(board[j][n-1]=='O'){
queue.add(new co(j,n-1));
visited[j][n-1]= true;
isX[j][n-1]= false;
}
} while(!queue.isEmpty()){
co c = queue.poll();
//up
if(c.x >= 1 && board[c.x-1][c.y] == 'O'&&!visited[c.x-1][c.y]){
visited[c.x-1][c.y] = true;
isX[c.x-1][c.y] = false;
queue.add(new co(c.x-1, c.y));
}
//down
if(c.x+1<m && board[c.x+1][c.y]=='O' && !visited[c.x+1][c.y]){
visited[c.x+1][c.y] = true;
isX[c.x+1][c.y]= false;
queue.add(new co(c.x+1, c.y));
}
//left
if(c.y-1>=0 && board[c.x][c.y-1]=='O' && !visited[c.x][c.y-1]){
visited[c.x][c.y-1] = true;
isX[c.x][c.y-1] = false;
queue.add(new co(c.x, c.y-1));
}
//right
if(c.y+1<n && board[c.x][c.y+1] == 'O' && !visited[c.x][c.y+1]){
visited[c.x][c.y+1] = true;
isX[c.x][c.y+1] = false;
queue.add(new co(c.x, c.y+1));
}
}
for(int i = 0;i < m;i++){
for(int j = 0;j < n;j++){
if(isX[i][j] )
board[i][j]= 'X';
}
}
return;
}
}

【leetcode刷题笔记】Surrounded Regions的更多相关文章

  1. LeetCode刷题笔记和想法(C++)

    主要用于记录在LeetCode刷题的过程中学习到的一些思想和自己的想法,希望通过leetcode提升自己的编程素养 :p 高效leetcode刷题小诀窍(这只是目前对我自己而言的小方法,之后会根据自己 ...

  2. 18.9.10 LeetCode刷题笔记

    本人算法还是比较菜的,因此大部分在刷基础题,高手勿喷 选择Python进行刷题,因为坑少,所以不太想用CPP: 1.买股票的最佳时期2 给定一个数组,它的第 i 个元素是一支给定股票第 i 天的价格. ...

  3. LeetCode刷题笔记 - 12. 整数转罗马数字

    学好算法很重要,然后要学好算法,大量的练习是必不可少的,LeetCode是我经常去的一个刷题网站,上面的题目非常详细,各个标签的题目都有,可以整体练习,本公众号后续会带大家做一做上面的算法题. 官方链 ...

  4. Leetcode刷题笔记(双指针)

    1.何为双指针 双指针主要用来遍历数组,两个指针指向不同的元素,从而协同完成任务.我们也可以类比这个概念,推广到多个数组的多个指针. 若两个指针指向同一数组,遍历方向相同且不会相交,可以称之为滑动窗口 ...

  5. LeetCode刷题笔记(1-9)

    LeetCode1-9 本文更多是作为一个习题笔记,没有太多讲解 1.两数之和 题目请点击链接 ↑ 最先想到暴力解法,直接双循环,但是这样复杂度为n平方 public int[] twoSum(int ...

  6. leetcode刷题笔记

    (1)Best Time to Buy and Sell Stock Total Accepted: 10430 Total Submissions: 33800My Submissions Say ...

  7. leetcode刷题笔记08 字符串转整数 (atoi)

    题目描述 实现 atoi,将字符串转为整数. 在找到第一个非空字符之前,需要移除掉字符串中的空格字符.如果第一个非空字符是正号或负号,选取该符号,并将其与后面尽可能多的连续的数字组合起来,这部分字符即 ...

  8. LeetCode刷题笔记-回溯法-分割回文串

    题目描述: 给定一个字符串 s,将 s 分割成一些子串,使每个子串都是回文串. 返回 s 所有可能的分割方案. 示例: 输入: "aab"输出:[ ["aa", ...

  9. leetcode刷题笔记231 2的幂

    题目描述: 给定一个整数,写一个函数来判断它是否是2的幂. 题目分析: 判断一个整数是不是2的幂,可根据二进制来分析.2的幂如2,4,8,等有一个特点: 二进制数首位为1,其他位为0,如2为10,4为 ...

随机推荐

  1. Groovy基本类型与运算符

    字符串 1.1字符串段落 def s = """Groovy Grails JAVA """ 输出结果: Groovy Grails JAV ...

  2. 基于springCloud的分布式架构体系

    Spring Cloud作为一套微服务治理的框架,几乎考虑到了微服务治理的方方面面,之前也写过一些关于Spring Cloud文章,主要偏重各组件的使用,本次分享主要解答这两个问题:Spring Cl ...

  3. jdk的安装 打包jar 运行jar

    安装 系统变量→新建 JAVA_HOME 变量 . 变量值填写jdk的安装目录(本人是 E:\Java\jdk1.7.0) 系统变量→寻找 Path 变量→编辑 在变量值最后输入 %JAVA_HOME ...

  4. 任何应用程序都可拥有 Web Service 组件。

    任何应用程序都可拥有 Web Service 组件. Web Service 的创建与编程语言的种类无关. 本章节我们将为大家介绍使用 PHP 的 SOAP 扩展来创建 Web Service. SO ...

  5. flex datagrid itemrender wordwrap失效

    现在我是想把datagrid中的部分字体变个颜色. 但是重写set data函数后发现原先的wordwrap自动换行不好使了. 于是就在谷歌上找问题.. 参考了两篇: http://stackover ...

  6. libsvm以概率输出单个test样例的判别结果

    在函数svmtrain和svmpredict的输入参数部分加入'-b 1'比如原先是 svmtrain -c 8.0 -g 0.0078125 a1a.scale 修改过后就是 svmtrain -b ...

  7. Linux 超级守护进程 xinetd

    在Linux中,守护进程有两种方式,一种是svsy方式,一种是xinetd方式(超级守护进程). 每个守护进程都会有一个脚本,可以理解成工作配置文件,守护进程的脚本需要放在指定位置,独立启动守护进程: ...

  8. IOS 关于取消延迟执行函数的种种。performSelector与cancelPreviousPerformRequestsWithTarget

    本文非本人撰写     @interface NSObject (NSDelayedPerforming) - (void)performSelector:(SEL)aSelector withObj ...

  9. error C1853: “Debug\BigBuffer.pch”预编译头文件来自编译器的早期版本,或者预编译头为 C++ 而在 C 中使用它(或相反)

    <pre id="best-content-1299104064" mb-10"="" style="font-size: 14px; ...

  10. 网络免费API接口整理

    转载自: https://www.cnblogs.com/doit8791/p/9351629.html 从网上看到一些免费API接口,在个人开发小程序等应用练手时可试用. 各类无次数限制的免费API ...