时间复杂度: O(n)
空间复杂度:O(n)
题意解析:
就是把所有被“x”包围的“o”替换成 x。所谓 “包围” 是指 上下左右 四个方向,不包括斜上,斜下。。。
算法思路:
没有被“x” 围住: 就是 那一组联通的“o“ 连接到边界了,只要把连接到边界的 ”o“ 替换成*,其他的o就替换成x,最后再把*还原成O
在把连接到边界的O替换成* 用的是bfs,具体代码如下,time:52ms
/*
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
*/
class Solution {
public:
void solve(vector<vector<char>> &board) {
int height = board.size(), width;
if (height == 0)
return;
width = board[0].size();
//search the 2 colum (the first colum and the last colum)
for (int i = 0; i < height; i++){
if (board[i][0] == 'O')
bfs(i, 0, board);
if (board[i][width - 1] == 'O')
bfs(i, width - 1, board);
}
//search the first and last rows
for (int i = 1; i < width - 1; i++){
if (board[0][i] == 'O')
bfs(0, i, board);
if (board[height - 1][i] == 'O')
bfs(height - 1, i, board);
}
for (int i = 0; i < height; i++){
for (int j = 0; j < width; j++){
if (board[i][j] == '*'){
board[i][j] = 'O';
}
if (board[i][j] == 'O'){
board[i][j] = 'X';
}
}
}
}
private:
struct position{
int x;
int y;
};
void bfs(int x, int y, vector<vector<char>> &board){
queue<position> q_pos;
visit(x, y, board, q_pos);
while (!q_pos.empty()){
auto next_pos = q_pos.front();
q_pos.pop();
visit(x - 1, y, board, q_pos);
visit(x + 1, y, board, q_pos);
visit(x, y + 1, board, q_pos);
visit(x, y - 1, board, q_pos);
}
}
void visit(int x, int y, vector<vector<char>> &board, queue<position> &q_pos){
if (x < 0 || x >= board.size() || y < 0 || y >= board[0].size() || board[x][y] == 'X')
return;
if (board[x][y] == 'O'){
board[x][y] = '*';
position p;
p.x = x;
p.y = y;
q_pos.push(p);
}
}
};原文地址:http://blog.csdn.net/u011409995/article/details/39477549