#include <vector>
class Solution {
public:
/**
* 代码中的类名、方法名、参数名已经指定,请勿修改,直接返回方法规定的值即可
*
*
* @param board char字符型vector<vector<>>
* @return char字符型vector<vector<>>
*/
void dfs(vector<vector<char>> &board,int x,int y){
if (x < 0 || x >= board.size() ||
y < 0 || y >= board[0].size())
{
return;//出界了
}
if (board[x][y] == 'O') {
board[x][y] = 'B';
dfs(board, x-1, y);
dfs(board, x+1, y);
dfs(board, x, y+1);
dfs(board, x, y-1);
}
}
vector<vector<char> > surroundedArea(vector<vector<char> >& board) {
// write code here
if(board.empty()) return board;
int b = board.size();
//上下y深度扫描
for (int i = 0; i < b; ++i) {
dfs(board, 0, i);
dfs(board, board.size()-1, i);
}
//左右x深度扫描
for (int i = 0; i < b; ++i) {
dfs(board, i, 0);
dfs(board, i, board.size()-1);
}
for (int i = 0; i < b; ++i) {
for (int j = 0; j < b; ++j) {
if(board[i][j] == 'O'){
board[i][j] = 'X';
}
if(board[i][j] == 'B'){
board[i][j] = 'O';//还原
}
}
}
return board;
}
};
基本算法思想
使用深度优先搜索(DFS)来遍历与边界上的 'O' 相连的所有 'O',将其标记为 'B'。然后再遍历整个矩阵,将 'O' 替换为 'X',将 'B' 替换为 'O'。
时间复杂度:
假设矩阵的大小为 m x n,遍历矩阵的时间复杂度为 O(mn),DFS的时间复杂度为 O(mn)。所以总的时间复杂度为 O(mn)。
空间复杂度:
使用了递归调用的DFS算法,所以空间复杂度为递归调用栈的深度,最坏情况下为 O(mn)。

京公网安备 11010502036488号