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. nginx源代码分析--nginx模块解析

    nginx的模块很之多.能够觉得全部代码都是以模块的形式组织.这包含核心模块和功能模块,针对不同的应用场合.并不是全部的功能模块都要被用到,附录A给出的是默认configure(即简单的httpser ...

  2. mediawiki常用设置

    修改mediawiki的logo图标 在LocalSettings.php文件中添加或修改以下代码: //$wgLogo             = "$wgStylePath/common ...

  3. UIImagePickerController关于图片裁剪

    - (UIImage*)scaleImage:(UIImage*)anImage withEditingInfo:(NSDictionary*)editInfo{ UIImage *newImage; ...

  4. TLS,SSL,HTTPS with Python(转)

    From: 扫盲 HTTPS 和 SSL/TLS 协议[0]:引子 需要了解的背景知识: 术语 HTTPS,SSL,TLS 长连接与短连接的关系 了解 CA 证书 基本流程 一.术语扫盲 1.什么是S ...

  5. 第一百八十四节,jQuery-UI,验证注册表单

    jQuery-UI,验证注册表单 html <form id="reg" action="123.html" title="会员注册" ...

  6. Eclipse 浏览(Navigate)菜单浏览 Eclipse 工作空间

    Eclipse 浏览(Navigate)菜单 浏览 Eclipse 工作空间 浏览(Navigate)菜单提供了多个菜单可以让你快速定位到指定资源. 上图中 Open Type, Open Type ...

  7. SSH框架解析

    当也许能够说是与你的初恋.妙龄的少女開始有些羞涩.是时候说说SHH的故事了.SHH是指Spring+Struts+Hibernate.还记研究生复试那天的面试,老师说了一句话Spring的核心是控制反 ...

  8. Unity3D学习笔记——组件之Mesh(网格)

    Mesh:网格组件.主要用于设置外形和外表. Mesh Filter:网格过滤器.就是为游戏对象添加一个外形. 例:设置外形为Sphere  如果获取的网格拥有蒙皮信患,Unity将自动创建一个skn ...

  9. HttpURLConnectionClient

    package com.utils; import com.pay.util.AES; import org.apache.log4j.Logger; import javax.net.ssl.Htt ...

  10. VS2008试用版到期解决办法----win7下VS2008升级补丁.zip

    打开好久没用的Visual studio 2008,才知道试用版已经到期了.在网上找来了序列号,可是连一个输入序列号的地方都没有,困惑了好久,终于找到了解决办法. 首先献上自己收集的Visual st ...