130. 被围绕的区域
深度优先搜索
class Solution {
int m;
int n;
boolean[][] used;
int[][] move = {{0, 1}, {1, 0}, {0, -1}, {-1, 0}};
public void solve(char[][] board) {
m = board.length;
n = board[0].length;
used = new boolean[m][n];
for (int i = 0; i < m; i++) {
for (int j = 0; j < n; j++) {
/**
* 逆向思维
* 题目要找出被包围且不是边界的O,但是这很麻烦
* 因此可以从边界上的O开始,遍历所有和它相连的O,将其标记为true
* 最后所有标记为false的O都要被替换
*/
if (board[i][j] == 'O' && !used[i][j] && (i == 0 || i == m - 1 || j == 0 || j == n - 1)) {
dfs(board, i, j);
}
}
}
for (int i = 0; i < m; i++) {
for (int j = 0; j < n; j++) {
if (board[i][j] == 'O' && !used[i][j]) {
board[i][j] = 'X';
}
}
}
}
public void dfs(char[][] board, int row, int col) {
used[row][col] = true;
for (int i = 0; i < 4; i++) {
int newRow = row + move[i][0];
int newCol = col + move[i][1];
if (newRow >= 0 && newRow < m && newCol >= 0 && newCol < n && !used[newRow][newCol] && board[newRow][newCol] == 'O') {
dfs(board, newRow, newCol);
}
}
}
}
/**
* 时间复杂度 O(m×n)
* 空间复杂度 O(m×n)
*/
https://leetcode-cn.com/problems/surrounded-regions/