leetcode-200. 島嶼數量

 

給你一個由 '1'(陸地)和 '0'(水)組成的的二維網格,請你計算網格中島嶼的數量。

島嶼總是被水包圍,並且每座島嶼只能由水平方向和/或豎直方向上相鄰的陸地連接形成。

此外,你可以假設該網格的四條邊均被水包圍。

示例 1:

輸入:
11110
11010
11000
00000
輸出: 1

示例 2:

輸入:
11000
11000
00100
00011
輸出: 3
解釋: 每座島嶼只能由水平和/或豎直方向上相鄰的陸地連接而成。

解題思路:從起始位置 0,0 開始搜索,找到第一個 ‘1’ 時修改其位置元素值作爲訪問標記,然後搜索上下左右所有相鄰位置的值爲1的元素,如果有相鄰元素爲‘1’,那麼就在以這個元素爲中心搜索與之相鄰的1,直至所有與之相鄰的‘1’都被訪問過爲止。這樣就已經將第一個島嶼的所有值均修改爲2,此時在搜索下一個爲‘1’的元素,它就是下一個島嶼。

class Solution {

    public int numIslands(char[][] grid) {
        if(grid.length == 0) {
            return 0;
        }
        int n = grid.length;
        int m = grid[0].length;
        int count = 0;
        for(int i = 0; i < n; i++) {
            for(int j = 0; j < m; j++) {
                if(grid[i][j] == '1') {
                    count++;
                    this.dfs(grid, i, j);
                }
            }
        }
        return count;
    }

    private void dfs(char[][] grid, int n, int m) {
        // 隨便設置一個非 0,1的值作爲訪問標記
        grid[n][m] = '2';
        // 下標越界拆分判斷可以提高判斷速度,並且減去無用的分支
        // 上
        if(n - 1 >= 0 && grid[n-1][m] == '1') {
            this.dfs(grid, n - 1, m);
        }
        // 下
        if(n + 1 < grid.length && grid[n+1][m] == '1'){
            this.dfs(grid, n+1, m);
        }
        // 左
        if(m - 1 >= 0 && grid[n][m-1] == '1') {
            this.dfs(grid, n, m - 1);
        }
        // 右
        if(m + 1 < grid[0].length && grid[n][m+1] == '1') {
            this.dfs(grid, n, m+1);
        }
    }
}

 

 

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章