【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为 ...
随机推荐
- 随机生成数,摘自算法竞赛入门经典P120-P123测试STL。
//#include<bits/stdc++.h> #include<cstring> #include<iostream> #include<cstdio& ...
- plsql programming 13 其他数据类型
bolean 类型 raw 类型, 用来保存和操作少量的二进制数据. urowid 和 rowid 类型, 这两种数据类型表示数据库的 rowid. 所谓 rowid 就是一个标识符-用来表示数据库中 ...
- 解决android studio引用远程仓库下载慢(转)
解决android studio引用远程仓库下载慢(JCenter下载慢) 第一种方法 使用开源中国的maven库 阿里云的(速度飞快):http://maven.aliyun.com/nexus/c ...
- 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读成 ...
- windows cmd 命令
dir 查看文件,参数:/Q显示文件及目录属系统哪个用户,/T:C显示文件创建时间,/T:A显示文件上次被访问时间,/T:W上次被修改时间 set 显示当前所有的环境变量 find 文件名 查找某文件 ...
- python中json操作
1.写操作.json文件dumps().dump()函数 d = { 'zll': { 'addr': '北京', 'age': 28 }, 'ljj': { 'addr': '北京', 'age': ...
- 【BZOJ1811】[Ioi2005]mea 乱搞
[BZOJ1811][Ioi2005]mea Description 考虑一个非递减的整数序列 S1,....Sn+1(Si<=Si+1 1<=i<=n). 序列M1...Mn是定义 ...
- hdu 4617 Weapon【异面直线距离——基础三维几何】
链接: http://acm.hdu.edu.cn/showproblem.php?pid=4617 Weapon Time Limit: 3000/1000 MS (Java/Others) ...
- Solr 查询时候关键期 编码问题
背景架构: 中间是dubbo 调用, 其实还是编码问题!没啥大问题!记录下
- Linux彻底删除mysql5.6
查看安装的mysql组件 rpm -qa | grep -i mysql mysql57-community-release-el6-8.noarch mysql-community-common-5 ...