【leetcode刷题笔记】Surrounded Regions
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的更多相关文章
- LeetCode刷题笔记和想法(C++)
主要用于记录在LeetCode刷题的过程中学习到的一些思想和自己的想法,希望通过leetcode提升自己的编程素养 :p 高效leetcode刷题小诀窍(这只是目前对我自己而言的小方法,之后会根据自己 ...
- 18.9.10 LeetCode刷题笔记
本人算法还是比较菜的,因此大部分在刷基础题,高手勿喷 选择Python进行刷题,因为坑少,所以不太想用CPP: 1.买股票的最佳时期2 给定一个数组,它的第 i 个元素是一支给定股票第 i 天的价格. ...
- LeetCode刷题笔记 - 12. 整数转罗马数字
学好算法很重要,然后要学好算法,大量的练习是必不可少的,LeetCode是我经常去的一个刷题网站,上面的题目非常详细,各个标签的题目都有,可以整体练习,本公众号后续会带大家做一做上面的算法题. 官方链 ...
- Leetcode刷题笔记(双指针)
1.何为双指针 双指针主要用来遍历数组,两个指针指向不同的元素,从而协同完成任务.我们也可以类比这个概念,推广到多个数组的多个指针. 若两个指针指向同一数组,遍历方向相同且不会相交,可以称之为滑动窗口 ...
- LeetCode刷题笔记(1-9)
LeetCode1-9 本文更多是作为一个习题笔记,没有太多讲解 1.两数之和 题目请点击链接 ↑ 最先想到暴力解法,直接双循环,但是这样复杂度为n平方 public int[] twoSum(int ...
- leetcode刷题笔记
(1)Best Time to Buy and Sell Stock Total Accepted: 10430 Total Submissions: 33800My Submissions Say ...
- leetcode刷题笔记08 字符串转整数 (atoi)
题目描述 实现 atoi,将字符串转为整数. 在找到第一个非空字符之前,需要移除掉字符串中的空格字符.如果第一个非空字符是正号或负号,选取该符号,并将其与后面尽可能多的连续的数字组合起来,这部分字符即 ...
- LeetCode刷题笔记-回溯法-分割回文串
题目描述: 给定一个字符串 s,将 s 分割成一些子串,使每个子串都是回文串. 返回 s 所有可能的分割方案. 示例: 输入: "aab"输出:[ ["aa", ...
- leetcode刷题笔记231 2的幂
题目描述: 给定一个整数,写一个函数来判断它是否是2的幂. 题目分析: 判断一个整数是不是2的幂,可根据二进制来分析.2的幂如2,4,8,等有一个特点: 二进制数首位为1,其他位为0,如2为10,4为 ...
随机推荐
- valgrind调查内存leak
快有几个月没更新了,记录一下最近解决问题用到的工具吧. 最近代码跑压力测试,总是发现内存在无规律的慢慢增加,因此在Android上用上了大名顶顶的valgrind,说实话,真是名不虚传, 真是建议以后 ...
- [浪风JQuery开发]jquery最有意思的IFrame类似应用--值得深入研究
前几天一时兴起答应朋友的需求--做一个外国的企业网站: 本想做就做呗,可没想我辛辛苦苦用浪风认真php平台开发后,对方来一句我服务器不能安装其他程序,请给我用frame框架开发. 浪风那是一个苦字难言 ...
- Hibernate体系结构
Hibernate架构包括许多对象持久对象,会话工厂,事务工厂,连接工厂,会话,事务等. hibernate架构中有4层Java应用层,hibernate框架层,反手api层和数据库层.请参见hibe ...
- struts.properties文件
此配置文件提供了一种机制来更改默认行为的框架.其实所有的struts.propertiesconfiguration文件中包含的属性也可以被配置在web.xml中使用的init-param,以及在st ...
- Python Theano TypeError: Cannot convert Type TensorType(float64, vector) (of Variable Subtensor{int64:int64:}.0) into Type TensorType(float64, matrix)
参考: https://groups.google.com/forum/#!topic/theano-users/teA-07wOFpE 这个问题出现的原因是,我在读文件的时候,应该Train_X读成 ...
- 安装ruby环境
安装ruby环境 通过 homebrew 安装 Ruby 1. 首先,须要在系统上安装 homebrew 在命令行下,运行下面命令就可以完毕 homebrew 的安装(安装过程中将提示输入当前用户的p ...
- hdu 3394(点双连通)
题目链接:http://acm.hdu.edu.cn/showproblem.php?pid=3394 思路:题目的意思是要求无向图中的冲突边和不需要边的条数,如果一个块中有多个环,则该块中的每条边都 ...
- 1254 Problem V
问题 V: 光棍的yy 时间限制: 1 Sec 内存限制: 128 MB 提交: 42 解决: 22 [提交][状态][讨论版] 题目描述 yy经常遇见一个奇怪的事情,每当他看时间的时候总会看见1 ...
- hdu5125(LIS)
相当于用多个O(nlog(n))LIS来做. // // main.cpp // 160322 // // Created by 陈加寿 on 16/3/22. // Copyright © 2016 ...
- SharePoint服务器端对象模型 之 访问文件和文件夹(Part 1)
本节中所阐述的内容,主要适用于SharePoint文档库中的文件和文件夹,以及列表中的文件夹.系统中的其他文件(如_layouts中的文件.配置文件.程序文件等)不在本章节的讨论范围之内. (一) ...