1. 程式人生 > 實用技巧 >LeetCode 130 被圍繞的區域

LeetCode 130 被圍繞的區域

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); // 右
    }
}