题目
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
深度优先 DFS 遍历矩阵的边缘元素,将O相连的区域赋值为1,其他的为0,在将flag标志为0的board置为X。
class Solution {
public:
void solve(vector> &board) {
// Start typing your C/C++ solution below
// DO NOT write int main() function
int rows = board.size();
if(rows<=0)
return;
int cols = board[0].size();
vector> flag(rows,vector(cols,0));
for(int i=0;i> &board,vector> &flag)
{
int rows = board.size();
int cols = board[0].size();
if(i<0||i>=rows||j<0||j>=cols)
return ;
if(board[i][j]=='X')
return ;
if(board[i][j]=='O' && flag[i][j]==0)
{
flag[i][j]=1;
dfs(i,j-1,board,flag);
dfs(i,j+1,board,flag);
dfs(i+1,j,board,flag);
dfs(i-1,j,board,flag);
}
}
};
注意:要对 flag 数组初始化 vector
上述运行结果是 对于 Juge Small 运行正确,但是对于 Juge Large 会出现 Runtime Error 。
因该是 运行时内存溢出,主要是用到了 flag 数组。其实完全不必用到的。下面的改进。
1、First scan the four edges of the board, if you meet an 'O', call a recursive mark function to mark that region to something else (for example, '+');
2、scan all the board, if you meet an 'O', flip it to 'X';
3、scan again the board, if you meet an '+', flip it to 'O';
step 2 and 3 can be merged.
然后我实现的代码如下:
class Solution {
public:
void dfs(int i,int j,vector> &board)
{
if(i<0 || i>=board.size() || j<0 || j>=board[0].size() )
return;
if(board[i][j]=='O')
{
board[i][j]='#';
dfs(i,j+1,board);
dfs(i,j-1,board);
dfs(i-1,j,board);
dfs(i+1,j,board);
}
}
void solve(vector> &board) {
// Start typing your C/C++ solution below
// DO NOT write int main() function
int rows = board.size();
if(rows<=2)
return ;
int cols = board[0].size();
for(int i=0;i
这样就可以完全的 Juge Large 了。
class Solution {
private:
struct Node
{
int x,y;
Node(){};
Node(int a,int b):x(a),y(b){};
};
public:
void solve(vector> &board) {
// Start typing your C/C++ solution below
// DO NOT write int main() function
int rows = board.size();
if(rows<=2) return ;
int cols = board[0].size();
queue myqueue;
for(int i=0;i=board.size() || ty<0 || ty>=board[0].size() || board[tx][ty]!='O')
continue ;
board[tx][ty]='#';
myqueue.push(Node(tx,ty));
}
}
for(int i=0;i
当然可以不用建立 Node 结构体,而是 queue
最新版本:
public class Solution {
// use a queue to do BFS
private Queue queue = new LinkedList();
public void solve(char[][] board) {
if(board == null){
return;
}
int row = board.length;
if(row <= 2) {
return;
}
int col = board[0].length;
if(col <= 2){
return;
}
for(int i=0; i= row || j < 0 || j>=col){
return;
}
if(board[i][j] == 'O'){
board[i][j] = '#';
queue.offer(i*col+j);
}
}
// DFS: Line 50: java.lang.StackOverflowError
private void dfs(int i, int j, char[][] board) {
int row = board.length;
int col = board[0].length;
if(i < 0 || i >= row || j < 0 || j>=col){
return;
}
if(board[i][j] == 'O'){
board[i][j] = '#';
dfs(i+1, j, board);
dfs(i-1, j, board);
dfs(i, j+1, board);
dfs(i, j-1, board);
}
}
}