题目传送:https://leetcode.cn/problems/surrounded-regions/
运行效率:
代码如下:
// 用于记录需要保留的'O', 如果boardFlag[i][j]=true;那就说明坐标[i][j]位置的'O'需要保留,而不需要替换成‘X’
boolean[][] boardFlag = null;
public void solve(char[][] board) {
if (boardFlag == null) {
boardFlag = new boolean[board.length][board[0].length];
}
//1、先从最上面一行开始,计算需要保留的’O‘
for (int i = 0; i < board[0].length; i++) {
dfs(board, 0, i);
}
//2、从最下面一行开始,计算需要保留的’O‘
for (int i = 0; i < board[0].length; i++) {
dfs(board, board.length - 1, i);
}
//3、从最左边一列开始,计算需要保留的’O‘
for (int i = 0; i < board.length; i++) {
dfs(board, i, 0);
}
//4、从最右边一列开始,计算需要保留的’O‘
for (int i = 0; i < board.length; i++) {
dfs(board, i, board[0].length-1);
}
//上面的4个for循环已经把需要保留的‘O’的位置标记在boardFlag 中了
//从左到右, 从上到下的遍历
for (int i = 0; i < board.length; i++) {
for (int j = 0; j < board[0].length; j++) { //把不需要保留的‘O’替换成'X'
if (board[i][j] == 'O' && !boardFlag[i][j]) {
board[i][j] = 'X';
}
}
}
}
public void dfs(char[][] board, int i, int j) {
//处理边界情况
if (board[i][j] != 'O') {
return;
}
boardFlag[i][j] = true;
//上
if (i - 1 >= 0 && !boardFlag[i - 1][j]) {
dfs(board, i - 1, j);
}
//下
if (i + 1 <= board.length - 1 && !boardFlag[i + 1][j]) {
dfs(board, i + 1, j);
}
//左
if (j - 1 >= 0 && !boardFlag[i][j - 1]) {
dfs(board, i, j - 1);
}
//右
if (j + 1 <= board[0].length - 1 && !boardFlag[i][j + 1]) {
dfs(board, i, j + 1);
}
}