leetcode 200. 島嶼數量 java


題目:

給定一個由 '1'(陸地)和 '0'(水)組成的的二維網格,計算島嶼的數量。一個島被水包圍,並且它是通過水平方向或垂直方向上相鄰的陸地連接而成的。你可以假設網格的四個邊均被水包圍。

示例 1:

輸入:
11110
11010
11000
00000

輸出: 1
示例 2:

輸入:
11000
11000
00100
00011

輸出: 3

解題:

思路一:DFS

直覺

將二維網格看成一個無向圖,豎直或水平相鄰的 1 之間有邊。

算法

線性掃描整個二維網格,如果一個結點包含 1,則以其為根結點啟動深度優先搜索。在深度優先搜索過程中,每個訪問過的結點被標記為 0。計數啟動深度優先搜索的根結點的數量,即為島嶼的數量。

class Solution {
    void dfs(char[][] grid, int r, int c) {
        int nr = grid.length;
        int nc = grid[0].length;
        if (r < 0 || c < 0 || r >= nr || c >= nc || grid[r][c] == '0') {
            return;
        }
        grid[r][c] = '0';//將原本為1的元素修改為'0'
        dfs(grid, r - 1, c); //遍歷上下左右四個方向
        dfs(grid, r + 1, c);
        dfs(grid, r, c - 1);
        dfs(grid, r, c + 1);
    }

    public int numIslands(char[][] grid) {
        if (grid == null || grid.length == 0) {
            return 0;
        }
        int nr = grid.length;
        int nc = grid[0].length;
        int num_islands = 0;
        for (int r = 0; r < nr; ++r) {
            for (int c = 0; c < nc; ++c) {
                if (grid[r][c] == '1') {
                    ++num_islands;
                    dfs(grid, r, c);//將‘1’周邊的‘1’修改為‘0’
                }
            }
        }
        return num_islands;
    }
}

思路二:BFS

算法

線性掃描整個二維網格,如果一個結點包含 1,則以其為根結點啟動廣度優先搜索。將其放入隊列中,並將值設為 0 以標記訪問過該結點。迭代地搜索隊列中的每個結點,直到隊列為空。

 

class Solution {
    public int numIslands(char[][] grid) {
        if (grid == null || grid.length == 0) {
            return 0;
        }
        int nr = grid.length;
        int nc = grid[0].length;
        int num_islands = 0;
        for (int r = 0; r < nr; ++r) {
            for (int c = 0; c < nc; ++c) {
                if (grid[r][c] == '1') {
                    ++num_islands;
                    bfs(grid, r, c);
                }
            }
        }
        return num_islands;
    }
    //廣度優先搜索
    void bfs(char[][] grid, int r, int c) {
        int nr = grid.length;
        int nc = grid[0].length;
        if (r < 0 || c < 0 || r >= nr || c >= nc || grid[r][c] == '0') {
            return;
        }
        grid[r][c] = '0';//將原本為1的元素修改為'0'
        Queue<Integer> bfsQueue = new LinkedList<>();
        bfsQueue.add(r * nc + c);
        while (!bfsQueue.isEmpty()) {
            int id = bfsQueue.remove();
            int row = id / nc;
            int col = id % nc;
            if (row - 1 >= 0 && grid[row - 1][col] == '1') {
                bfsQueue.add((row - 1) * nc + col);
                grid[row - 1][col] = '0';
            }
            if (row + 1 < nr && grid[row + 1][col] == '1') {
                bfsQueue.add((row + 1) * nc + col);
                grid[row + 1][col] = '0';
            }
            if (col - 1 >= 0 && grid[row][col - 1] == '1') {
                bfsQueue.add(row * nc + col - 1);
                grid[row][col - 1] = '0';
            }
            if (col + 1 < nc && grid[row][col + 1] == '1') {
                bfsQueue.add(row * nc + col + 1);
                grid[row][col + 1] = '0';
            }
        }
    }
}

 

鏈接:https://leetcode-cn.com/problems/number-of-islands/solution/dao-yu-shu-liang-by-leetcode/

 



免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM