LeetCode 130 被圍繞的區域
阿新 • • 發佈:2020-08-11
Leetcode 130 被圍繞的區域
給定一個二維字元陣列,其中只包含兩種字元:'O'、'X'
,要求將內部所有被'X'
包圍的'O'
全部置為'X'
。注意被包圍是指'O'
組成的區域周圍都是'X'
,若區域周圍存在至少一處邊界(i==0 || j==0 || i==board.length-1 || j== board[0].length-1)
則不算被包圍。
方法: 使用二維DFS/BFS,從邊界開始將未被包圍的'O'
做上標記,之後將內部所有未被標記的、被包圍的'O'置為'X',並將標記都恢復。
執行用時:2 ms, 在所有 Java 提交中擊敗了98.14%的使用者
記憶體消耗:42.2 MB, 在所有 Java 提交中擊敗了13.55%的使用者
class Solution { public void solve(char[][] board) { if (board == null || board.length == 0) return; int m = board.length; int n = board[0].length; for (int i = 0; i < m; i++) { for (int j = 0; j < n; j++) { // 從邊緣o開始搜尋 boolean isEdge = i == 0 || j == 0 || i == m - 1 || j == n - 1; if (isEdge && board[i][j] == 'O') { dfs(board, i, j); } } } for (int i = 0; i < m; i++) { for (int j = 0; j < n; j++) { if (board[i][j] == 'O') { board[i][j] = 'X'; } if (board[i][j] == '#') { board[i][j] = 'O'; } } } } public void dfs(char[][] board, int i, int j) { if (i < 0 || j < 0 || i >= board.length || j >= board[0].length || board[i][j] == 'X' || board[i][j] == '#') { // board[i][j] == '#' 說明已經搜尋過了. return; } board[i][j] = '#'; dfs(board, i - 1, j); // 上 dfs(board, i + 1, j); // 下 dfs(board, i, j - 1); // 左 dfs(board, i, j + 1); // 右 } }