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

LeetCode130. 被圍繞的區域

思路1:DFS

  如果把X看作海水,O看作陸地,被海水包圍的就是島嶼。沒有被海水包圍的陸地,與邊界有連通,就不是島嶼。判斷是否是島嶼比較困難,問題轉化為先找出非島嶼(凡是與邊界有聯絡的O),即對邊界上的 O 特殊處理。根據題意,四個邊的 0 以及與其相鄰的 0 都不能被替換為X,因此從邊界向裡面擴充套件。解決步驟為:

    1)把四周有 0 的地方都替換為 “#”,在四周進行floodfill演算法(染色)。

    2)再從頭到尾遍歷矩陣,把 0 換成 X, 把“#”換成0.

思路2:BFS

思路3:並查集

程式碼1:

class Solution {
    public void solve(char
[][] board) { if (board == null || board.length == 0) return; int m = board.length, n = board[0].length; // Step1:對邊界上的O特殊處理,進行FloodFill // 難點:如何只遍歷邊界 // for (int i = 0; i < m; i++) { // for (int j = 0; j < n; j++) { // if (i == 0 || i == m - 1 || j == 0 || j == n - 1) {
// if (board[i][j] == 'O') { // dfs(board, i, j); // } // } // } // } // 遍歷第一列 和 最後一列 for (int i = 0; i < m; i++) { if (board[i][0] == 'O') dfs(board, i, 0); if (board[i][n-1] == 'O') dfs(board, i, n-1); }
// 遍歷第一行 和 最後一行 for (int i = 1; i < n - 1; i++) { if (board[0][i] == 'O') dfs(board, 0, i); if (board[m-1][i] == 'O') dfs(board, m-1, i); } // Step2:重新遍歷矩陣,直接替換 for (int i = 0; i < m; i++) { for (int j = 0; j < n; j++) { if (board[i][j] == 'O') { board[i][j] = 'X'; }else if (board[i][j] == '#') { board[i][j] = 'O'; } } } } // 思路同島嶼問題 private void dfs(char[][] board, int x, int y) { if (x < 0 || x >= board.length || y < 0 || y >= board[0].length) return; if (board[x][y] != 'O') return; board[x][y] = '#'; dfs(board, x - 1, y); dfs(board, x, y + 1); dfs(board, x + 1, y); dfs(board, x, y - 1); } }