-
因为和边界连接的’O’不会改变,所以先从最层开始用DFS进行预处理,与边界连接的’O’做标记,预处理完再DFS进行改变。
-
空间复杂度O(M*N)
-
时间复杂度O(M*N)
class Solution {
int res = Integer.MIN_VALUE;
int[][] dir = new int[][] { { 0, 1 }, { 0, -1 }, { 1, 0 }, { -1, 0 } };
int r;
int c;
int[][] vis;
public void solve(char[][] board) {
//board小于两行:所有的O都在边界,直接返回
if(board.length <= 2 || board == null)
return;
r = board.length; //行
c = board[0].length;//列
vis = new int[r][c];
for (int i = 0; i < r; i++) {
if(board[i][0] == 'O' && vis[i][0] == 0) {
predfs(i, 0, board);
}
if(board[i][c-1] == 'O' && vis[i][c-1] == 0) {
predfs(i, c-1, board);
}
}
for (int i = 0; i < c; i++) {
if(board[0][i] == 'O' && vis[0][i] == 0) {
predfs(0, i, board);
}
if(board[r-1][i] == 'O' && vis[r-1][i] == 0) {
predfs(r-1, i, board);
}
}
for (int i = 0; i < r; i++) {
for (int j = 0; j < c; j++) {
if (board[i][j] == 'O' && vis[i][j] != 1) {
dfs(i, j, board);
}
}
}
return;
}
//预处理
private void predfs(int i, int j, char[][] board) {
vis[i][j] = 1; //边界标记
for (int[] d : dir) {
int newx = i + d[0];
int newy = j + d[1];
if (newx >= 0 && newx < r && newy >= 0 && newy < c) {
if(board[newx][newy] == 'O' && vis[newx][newy] != 1)
predfs(newx, newy, board);
}
}
}
public void dfs(int i, int j, char[][] board) {
board[i][j] = 'X';
for (int[] d : dir) {
int newx = i + d[0];
int newy = j + d[1];
if (newx >= 0 && newx < r && newy >= 0 && newy < c) {
if(board[newx][newy] == 'O' && vis[newx][newy] != 1)
dfs(newx, newy, board);
}
}
return;
}
}