题目概述
解题思路
题目要求把除了所有与位于边界的'O'邻接的'O'之外的'O'都变成'X'。所以我们要做这样几步:
- 首先,遍历四个边界,找到位于边界的'O';
- 然后,对于所有在边界的'O',以他们为起点进行深度优先搜索/广度优先搜索,找出所有与他们邻接的'O';
- 对余下的'O'做变换。
方法性能
O()的时间复杂度:
示例代码
class Solution {
public:
void solve(vector<vector<char>>& board)
{
int dir[4][2] = {1, 0, -1, 0, 0, 1, 0, -1};
int R = board.size(), C = board[0].size();
int **circles = new int *[R];
for(int i = 0; i < R; ++i)
{
circles[i] = new int[C];
for (int j = 0; j < C;++j)
circles[i][j] = -2;
}
vector< pair<int, int> > boarder;
for(int i = 0; i < R; ++i)
{
for(int j = 0; j < C;++j)
{
if(board[i][j] == 'O')
{
if(i == 0 || i == R - 1 || j == 0 || j == C - 1)
boarder.push_back({i, j});
circles[i][j] = -1;
}
}
}
//change value
if(boarder.size() == 0)
{
for(int i = 0; i < R; ++i)
{
for (int j = 0; j < C;++j)
{
board[i][j] = 'X';
}
}
return ;
}
//get adjacent nodes of boarder 'O's
deque<pair<int, int>> nodes;
for(int i = 0; i < boarder.size(); ++i)
nodes.push_back(boarder[i]);
while(nodes.size())
{
pair<int, int> temp_node = nodes.front();
nodes.pop_front();
circles[temp_node.first][temp_node.second] = 0;
for(int j = 0; j < 4;++j)
{
pair<int, int> adj_node = {
temp_node.first + dir[j][0],
temp_node.second + dir[j][1]
};
if(adj_node.first >= 0 && adj_node.first < R && adj_node.second >= 0 && adj_node.second < C)
{
if(circles[adj_node.first][adj_node.second] == -1)
{
circles[adj_node.first][adj_node.second] = 0;
nodes.push_front(adj_node);
}
}
}
}
//change value
for(int i = 0 ;i < R; ++i)
{
for (int j = 0; j < C;++j)
{
if (circles[i][j] == -1)
{
board[i][j] = 'X';
}
}
}
}
};