lintcode:被围绕的区域
被围绕的区域
给一个二维的矩阵,包含 'X'
和 'O'
, 找到所有被 'X' 围绕的区域,并用 'X' 填充满。
给出二维矩阵:
X X X X
X O O X
X X O X
X O X X
把被 'X' 围绕的区域填充之后变为:
X X X X
X X X X
X X X X
X O X X
解题
参考岛屿的个数 然而我还是写不出来
programcreek 有下面的一段话:
This problem is similar to Number of Islands. In this problem, only the cells on the
boarders can not be surrounded. So we can first merge those O’s on the boarders like
in Number of Islands and replace O’s with ’#’, and then scan the board and replace all
O’s left (if any)
先将边界中联通的O换成*,这里利用深度优先
最后遍历数组,O->X *->O,每个位置值遍历一次,不会出现混乱
public class Solution {
/**
* @param board a 2D board containing 'X' and 'O'
* @return void
*/
public void surroundedRegions(char[][] board) {
// Write your code here
if(board == null || board.length == 0|| board[0].length == 0)
return ;
int row = board.length;
int col = board[0].length;
for(int i =0;i< row;i++){
if(board[i][0] == 'O')
merge(board,i,0);
if(board[i][col-1] == 'O')
merge(board,i,col-1);
}
for(int j =0;j< col;j++){
if(board[0][j] == 'O')
merge(board,0,j);
if(board[row-1][j] == 'O')
merge(board,row-1,j);
}
// O->X *->O
for(int i=0;i<row;i++){
for(int j=0; j<col; j++){
if(board[i][j] == 'O'){
board[i][j] = 'X';
}else if(board[i][j] == '*'){
board[i][j] = 'O';
}
}
}
}
// 将边界联通的O 换成 *
public void merge(char[][] board,int row,int col){
if(row<0 || col<0 || row>= board.length || col>= board[0].length)
return;
if(board[row][col] != 'O')
return;
board[row][col] = '*';
merge(board,row,col+1);
merge(board,row+1,col);
merge(board,row-1,col);
merge(board,row,col-1);
}
}
This solution causes java.lang.StackOverflowError, because for a large board, too many method calls are pushed to the stack and causes the overflow.
programcreek 中又给了一个广度优先的算法
比较复杂,先把程序复杂过来
public class Solution {
// use a queue to do BFS
private Queue<Integer> queue = new LinkedList<Integer>(); public void solve(char[][] board) {
if (board == null || board.length == 0)
return; int m = board.length;
int n = board[0].length; // merge O's on left & right boarder
for (int i = 0; i < m; i++) {
if (board[i][0] == 'O') {
bfs(board, i, 0);
} if (board[i][n - 1] == 'O') {
bfs(board, i, n - 1);
}
} // merge O's on top & bottom boarder
for (int j = 0; j < n; j++) {
if (board[0][j] == 'O') {
bfs(board, 0, j);
} if (board[m - 1][j] == 'O') {
bfs(board, m - 1, j);
}
} // process the board
for (int i = 0; i < m; i++) {
for (int j = 0; j < n; j++) {
if (board[i][j] == 'O') {
board[i][j] = 'X';
} else if (board[i][j] == '#') {
board[i][j] = 'O';
}
}
}
} private void bfs(char[][] board, int i, int j) {
int n = board[0].length; // fill current first and then its neighbors
fillCell(board, i, j); while (!queue.isEmpty()) {
int cur = queue.poll();
int x = cur / n;
int y = cur % n; fillCell(board, x - 1, y);
fillCell(board, x + 1, y);
fillCell(board, x, y - 1);
fillCell(board, x, y + 1);
}
} private void fillCell(char[][] board, int i, int j) {
int m = board.length;
int n = board[0].length;
if (i < 0 || i >= m || j < 0 || j >= n || board[i][j] != 'O')
return; // add current cell is queue & then process its neighbors in bfs
queue.offer(i * n + j);
board[i][j] = '#';
}
}
update
public class Solution {
/**
* @param board a 2D board containing 'X' and 'O'
* @return void
*/
public void surroundedRegions(char[][] board) {
// Write your code here
if(board == null || board.length == 0 || board[0].length ==0)
return;
int row = board.length;
int col = board[0].length;
// 边界的 O 变为 P
for(int i =0;i<row;i++){
if(board[i][0] == 'O')
dfs(board,i,0,row,col);
if(board[i][col-1] == 'O')
dfs(board,i,col-1,row,col);
}
for(int j=0;j<col;j++){
if(board[0][j] == 'O')
dfs(board,0,j,row,col);
if(board[row-1][j] == 'O')
dfs(board,row-1,j,row,col); }
// 中间的 O-> X
for(int i=0;i<row;i++){
for(int j=0;j<col;j++){
if(board[i][j] == 'O')
board[i][j] = 'X';
}
}
// P 还原 O
for(int i=0;i<row;i++){
for(int j=0;j<col;j++){
if(board[i][j] == 'P')
board[i][j] = 'O';
}
}
}
// 将 ij 周围的 O - > P public void dfs(char[][] board,int i,int j,int row,int col){
if(i<0 ||i>=row ||j<0 ||j>=col)
return ;
if(board[i][j]=='O'){
board[i][j] ='P';
dfs(board,i+1,j,row,col);
dfs(board,i,j+1,row,col);
dfs(board,i-1,j,row,col);
dfs(board,i,j-1,row,col);
}
}
}
lintcode:被围绕的区域的更多相关文章
- lintcode - 被围绕的区域
class Solution { public: /* * @param board: board a 2D board containing 'X' and 'O' * @return: nothi ...
- [Swift]LeetCode130. 被围绕的区域 | Surrounded Regions
Given a 2D board containing 'X' and 'O' (the letter O), capture all regions surrounded by 'X'. A reg ...
- 【1】【leetcode-130】 被围绕的区域
(DFS思路对,写复杂了) 给定一个二维的矩阵,包含 'X' 和 'O'(字母 O). 找到所有被 'X' 围绕的区域,并将这些区域里所有的 'O' 用 'X' 填充. 示例: X X X X X O ...
- 286被围绕的区域 · Surrounded Regions
[抄题]: 给一个二维的矩阵,包含 'X' 和 'O', 找到所有被 'X' 围绕的区域,并用 'X' 填充满. 样例 给出二维矩阵: X X X X X O O X X X O X X O X X ...
- lintcode-477-被围绕的区域
477-被围绕的区域 给一个二维的矩阵,包含 'X' 和 'O', 找到所有被 'X' 围绕的区域,并用 'X' 填充满. 样例 给出二维矩阵: X X X X X O O X X X O X X O ...
- 130 Surrounded Regions 被围绕的区域
给定一个二维的矩阵,包含 'X' 和 'O'(字母 O), 找到所有被 'X' 围绕的区域.并将区域里所有 'O'用 'X' 填充.例如,X X X XX O O XX X O XX O X X运行你 ...
- Leetcode之深度优先搜索(DFS)专题-130. 被围绕的区域(Surrounded Regions)
Leetcode之深度优先搜索(DFS)专题-130. 被围绕的区域(Surrounded Regions) 深度优先搜索的解题详细介绍,点击 给定一个二维的矩阵,包含 'X' 和 'O'(字母 O) ...
- LeetCode 被围绕的区域
给定一个二维的矩阵,包含 'X' 和 'O'(字母 O). 找到所有被 'X' 围绕的区域,并将这些区域里所有的 'O' 用 'X' 填充. 示例: X X X X X O O X X X O X X ...
- LeetCode 130. 被围绕的区域(Surrounded Regions)
题目描述 给定一个二维的矩阵,包含 'X' 和 'O'(字母 O). 找到所有被 'X' 围绕的区域,并将这些区域里所有的 'O' 用 'X' 填充. 示例: X X X X X O O X X X ...
随机推荐
- linux系统下sd卡的备份与恢复
linux系统下sd卡的备份与恢复 现在各种的开发板都是从sd卡上面启动的,因此大修改工作之前很有必要备份一下. 备份 在linux系统下用读卡器读取sd卡 用df -h命令看分区的路径 一般都是/d ...
- NET Core静态文件的缓存方式
NET Core静态文件的缓存方式 阅读目录 一.前言 二.StaticFileMiddleware 三.ASP.NET Core与CDN? 四.写在最后 回到目录 一.前言 我们在优化Web服务的时 ...
- Android -- 系统信息(内存、cpu、sd卡、电量、版本)获取
内存(ram) android的总内存大小信息 ...
- 基于OpenMP的矩阵乘法实现及效率提升分析
一. 矩阵乘法串行实现 例子选择两个1024*1024的矩阵相乘,根据矩阵乘法运算得到运算结果.其中,两个矩阵中的数为double类型,初值由随机数函数产生.代码如下: #include <i ...
- Careercup - Microsoft面试题 - 5175246478901248
2014-05-11 23:52 题目链接 原题: design an alarm clock for a deaf person. 题目:为聋人设计闹钟? 解法:聋人听不见,那么闪光.震动都可行.睡 ...
- The income statement
The income statement measures performance over some period of time,usually a quarter or a year.The ...
- 为什么匿名内部类参数必须为final类型(转载)
为什么匿名内部类参数必须为final类型转自于:http://feiyeguohai.iteye.com/blog/1500108 1) 从程序设计语言的理论上:局部内部类(即:定义在方法中的内部类 ...
- 【BZOJ】【2500】幸福的道路
树形DP+单调队列优化DP 好题(也是神题……玛雅我实在是太弱了TAT,真是一个250) 完全是抄的zyf的……orz我还是退OI保平安吧 第一步对于每一天求出一个从第 i 个点出发走出去的最长链的长 ...
- 【BZOJ】【1031】【JSOI2007】字符加密Cipher
后缀数组 当年感觉好神的题现在好像变水了…… 题意其实有点蛋疼……一开始没看懂<_< 将原串复制一遍接在后面,用后缀数组求一下SA,那么SA<n的就是所找到的那n个字符串,然后把它们 ...
- 利用PE数据目录的导入表获取函数名及其地址
PE文件是以64字节的DOS文件头开始的(IMAGE_DOS_HEADER),接着是一段小DOS程序,然后是248字节的 NT文件头(IMAGE_NT_HEADERS),NT的文件头位置由IMAGE_ ...