class Solution {
public:
void solve(vector<vector<char>>& board) {
}
};
130. 被围绕的区域
给你一个m x n
的矩阵 board
,由若干字符 'X'
和 'O'
,找到所有被 'X'
围绕的区域,并将这些区域里所有的 'O'
用 'X'
填充。
示例 1:
输入:board = [["X","X","X","X"],["X","O","O","X"],["X","X","O","X"],["X","O","X","X"]] 输出:[["X","X","X","X"],["X","X","X","X"],["X","X","X","X"],["X","O","X","X"]] 解释:被围绕的区间不会存在于边界上,换句话说,任何边界上的'O'
都不会被填充为'X'
。 任何不在边界上,或不与边界上的'O'
相连的'O'
最终都会被填充为'X'
。如果两个元素在水平或垂直方向相邻,则称它们是“相连”的。
示例 2:
输入:board = [["X"]] 输出:[["X"]]
提示:
m == board.length
n == board[i].length
1 <= m, n <= 200
board[i][j]
为 'X'
或 'O'
原站题解
golang 解法, 执行用时: 16 ms, 内存消耗: 6.2 MB, 提交时间: 2023-09-28 15:12:07
var ( dx = [4]int{1, -1, 0, 0} dy = [4]int{0, 0, 1, -1} ) var n, m int // bfs func solve(board [][]byte) { if len(board) == 0 || len(board[0]) == 0 { return } n, m := len(board), len(board[0]) queue := [][]int{} for i := 0; i < n; i++ { if board[i][0] == 'O' { queue = append(queue, []int{i, 0}) board[i][0] = 'A' } if board[i][m-1] == 'O' { queue = append(queue, []int{i, m - 1}) board[i][m - 1] = 'A' } } for i := 1; i < m - 1; i++ { if board[0][i] == 'O' { queue = append(queue, []int{0, i}) board[0][i] = 'A' } if board[n-1][i] == 'O' { queue = append(queue, []int{n - 1, i}) board[n - 1][i] = 'A' } } for len(queue) > 0 { cell := queue[0] queue = queue[1:] x, y := cell[0], cell[1] for i := 0; i < 4; i++ { mx, my := x + dx[i], y + dy[i] if mx < 0 || my < 0 || mx >= n || my >= m || board[mx][my] != 'O' { continue } queue = append(queue, []int{mx, my}) board[mx][my] = 'A' } } for i := 0; i < n; i++ { for j := 0; j < m; j++ { if board[i][j] == 'A' { board[i][j] = 'O' } else if board[i][j] == 'O' { board[i][j] = 'X' } } } } // dfs func solve2(board [][]byte) { if len(board) == 0 || len(board[0]) == 0 { return } n, m = len(board), len(board[0]) for i := 0; i < n; i++ { dfs(board, i, 0) dfs(board, i, m - 1) } for i := 1; i < m - 1; i++ { dfs(board, 0, i) dfs(board, n - 1, i) } for i := 0; i < n; i++ { for j := 0; j < m; j++ { if board[i][j] == 'A' { board[i][j] = 'O' } else if board[i][j] == 'O' { board[i][j] = 'X' } } } } func dfs(board [][]byte, x, y int) { if x < 0 || x >= n || y < 0 || y >= m || board[x][y] != 'O' { return } board[x][y] = 'A' dfs(board, x + 1, y) dfs(board, x - 1, y) dfs(board, x, y + 1) dfs(board, x, y - 1) }
python3 解法, 执行用时: 60 ms, 内存消耗: 21 MB, 提交时间: 2023-09-28 15:10:30
class Solution: # dfs def solve(self, board: List[List[str]]) -> None: if not board: return n, m = len(board), len(board[0]) def dfs(x, y): if not 0 <= x < n or not 0 <= y < m or board[x][y] != 'O': return board[x][y] = "A" dfs(x + 1, y) dfs(x - 1, y) dfs(x, y + 1) dfs(x, y - 1) for i in range(n): dfs(i, 0) dfs(i, m - 1) for i in range(m - 1): dfs(0, i) dfs(n - 1, i) for i in range(n): for j in range(m): if board[i][j] == "A": board[i][j] = "O" elif board[i][j] == "O": board[i][j] = "X" # bfs def solve2(self, board: List[List[str]]) -> None: if not board: return n, m = len(board), len(board[0]) que = collections.deque() for i in range(n): if board[i][0] == "O": que.append((i, 0)) board[i][0] = "A" if board[i][m - 1] == "O": que.append((i, m - 1)) board[i][m - 1] = "A" for i in range(m - 1): if board[0][i] == "O": que.append((0, i)) board[0][i] = "A" if board[n - 1][i] == "O": que.append((n - 1, i)) board[n - 1][i] = "A" while que: x, y = que.popleft() for mx, my in [(x - 1, y), (x + 1, y), (x, y - 1), (x, y + 1)]: if 0 <= mx < n and 0 <= my < m and board[mx][my] == "O": que.append((mx, my)) board[mx][my] = "A" for i in range(n): for j in range(m): if board[i][j] == "A": board[i][j] = "O" elif board[i][j] == "O": board[i][j] = "X"
java 解法, 执行用时: 2 ms, 内存消耗: 42.9 MB, 提交时间: 2023-09-28 15:09:38
class Solution { // bfs int[] dx = {1, -1, 0, 0}; int[] dy = {0, 0, 1, -1}; int n, m; public void solve(char[][] board) { int n = board.length; if (n == 0) { return; } int m = board[0].length; Queue<int[]> queue = new LinkedList<int[]>(); for (int i = 0; i < n; i++) { if (board[i][0] == 'O') { queue.offer(new int[]{i, 0}); board[i][0] = 'A'; } if (board[i][m - 1] == 'O') { queue.offer(new int[]{i, m - 1}); board[i][m - 1] = 'A'; } } for (int i = 1; i < m - 1; i++) { if (board[0][i] == 'O') { queue.offer(new int[]{0, i}); board[0][i] = 'A'; } if (board[n - 1][i] == 'O') { queue.offer(new int[]{n - 1, i}); board[n - 1][i] = 'A'; } } while (!queue.isEmpty()) { int[] cell = queue.poll(); int x = cell[0], y = cell[1]; for (int i = 0; i < 4; i++) { int mx = x + dx[i], my = y + dy[i]; if (mx < 0 || my < 0 || mx >= n || my >= m || board[mx][my] != 'O') { continue; } queue.offer(new int[]{mx, my}); board[mx][my] = 'A'; } } for (int i = 0; i < n; i++) { for (int j = 0; j < m; j++) { if (board[i][j] == 'A') { board[i][j] = 'O'; } else if (board[i][j] == 'O') { board[i][j] = 'X'; } } } } // dfs public void solve2(char[][] board) { n = board.length; if (n == 0) { return; } m = board[0].length; for (int i = 0; i < n; i++) { dfs(board, i, 0); dfs(board, i, m - 1); } for (int i = 1; i < m - 1; i++) { dfs(board, 0, i); dfs(board, n - 1, i); } for (int i = 0; i < n; i++) { for (int j = 0; j < m; j++) { if (board[i][j] == 'A') { board[i][j] = 'O'; } else if (board[i][j] == 'O') { board[i][j] = 'X'; } } } } public void dfs(char[][] board, int x, int y) { if (x < 0 || x >= n || y < 0 || y >= m || board[x][y] != 'O') { return; } board[x][y] = 'A'; dfs(board, x + 1, y); dfs(board, x - 1, y); dfs(board, x, y + 1); dfs(board, x, y - 1); } }
cpp 解法, 执行用时: 12 ms, 内存消耗: 10.1 MB, 提交时间: 2023-09-28 15:08:10
class Solution { public: int n, m; const int dx[4] = {1, -1, 0, 0}; const int dy[4] = {0, 0, 1, -1}; void dfs(vector<vector<char>>& board, int x, int y) { if (x < 0 || x >= n || y < 0 || y >= m || board[x][y] != 'O') { return; } board[x][y] = 'A'; dfs(board, x + 1, y); dfs(board, x - 1, y); dfs(board, x, y + 1); dfs(board, x, y - 1); } // dfs void solve(vector<vector<char>>& board) { n = board.size(); if (n == 0) { return; } m = board[0].size(); for (int i = 0; i < n; i++) { dfs(board, i, 0); dfs(board, i, m - 1); } for (int i = 1; i < m - 1; i++) { dfs(board, 0, i); dfs(board, n - 1, i); } for (int i = 0; i < n; i++) { for (int j = 0; j < m; j++) { if (board[i][j] == 'A') { board[i][j] = 'O'; } else if (board[i][j] == 'O') { board[i][j] = 'X'; } } } } // bfs void solve2(vector<vector<char>>& board) { int n = board.size(); if (n == 0) { return; } int m = board[0].size(); queue<pair<int, int>> que; for (int i = 0; i < n; i++) { if (board[i][0] == 'O') { que.emplace(i, 0); board[i][0] = 'A'; } if (board[i][m - 1] == 'O') { que.emplace(i, m - 1); board[i][m - 1] = 'A'; } } for (int i = 1; i < m - 1; i++) { if (board[0][i] == 'O') { que.emplace(0, i); board[0][i] = 'A'; } if (board[n - 1][i] == 'O') { que.emplace(n - 1, i); board[n - 1][i] = 'A'; } } while (!que.empty()) { int x = que.front().first, y = que.front().second; que.pop(); for (int i = 0; i < 4; i++) { int mx = x + dx[i], my = y + dy[i]; if (mx < 0 || my < 0 || mx >= n || my >= m || board[mx][my] != 'O') { continue; } que.emplace(mx, my); board[mx][my] = 'A'; } } for (int i = 0; i < n; i++) { for (int j = 0; j < m; j++) { if (board[i][j] == 'A') { board[i][j] = 'O'; } else if (board[i][j] == 'O') { board[i][j] = 'X'; } } } } };