【LeetCode】島嶼數量(DFS深度優先搜索)--島嶼最大面積(DFS)

LeetCode第200題孤島數量,題目地址

題目描述:

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

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

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

例子:

輸入:
11110
11010
11000
00000
輸出: 1

解題:DFS

分析根據題意,陸地連接方式:上下左右,錯對角不算連接。考慮將遍歷過的孤島元素(能連接上的島嶼)值設置爲0,避免二次遍歷。當然你也可以假設這個矩陣是int[][],不妨礙使用上述思路解決問題。

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';
        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);
                }
            }
        }

        return num_islands;
    }
}

複雜度:

時間複雜度:O(MN),遍歷全部元素。

空間複雜度:O(1),需要存一些常量。

                                                                                                                                                                                            20200605D


島嶼的變種題

LeetCode第695題,島嶼的最大面積,題目地址

題目描述:

給定一個包含了一些 0 和 1 的非空二維數組 grid 。

一個 島嶼 是由一些相鄰的 1 (代表土地) 構成的組合,這裏的「相鄰」要求兩個 1 必須在水平或者豎直方向上相鄰。你可以假設 grid 的四個邊緣都被 0(代表水)包圍着。

找到給定的二維數組中最大的島嶼面積。(如果沒有島嶼,則返回面積爲 0 。)

例子:

[[0,0,1,0,0,0,0,1,0,0,0,0,0],
 [0,0,0,0,0,0,0,1,1,1,0,0,0],
 [0,1,1,0,1,0,0,0,0,0,0,0,0],
 [0,1,0,0,1,1,0,0,1,0,1,0,0],
 [0,1,0,0,1,1,0,0,1,1,1,0,0],
 [0,0,0,0,0,0,0,0,0,0,1,0,0],
 [0,0,0,0,0,0,0,1,1,1,0,0,0],
 [0,0,0,0,0,0,0,1,1,0,0,0,0]]

答案:6,島嶼只能包含垂直和水平方向。

解題:

分析:相比於上題,這裏的dfs函數需要有返回值,返回值表示島嶼的數量,也就是全連同的1的個數。

class Solution {
    public int maxAreaOfIsland(int[][] grid) {
        int res = 0;
        for (int i = 0; i < grid.length; i++){
            for (int j = 0; j < grid[0].length; j++){
                if (grid[i][j] == 1){
                    res = Math.max(res, dfs(i,j,grid));
                }
            }
        }
        return res;
    }
    public int dfs (int i, int j, int[][] grid){
        if (i < 0 || j < 0 || i >= grid.length || j >= grid[0].length || grid[i][j] == 0){
            return 0;
        }
        grid[i][j] = 0;
        int num = 1;//能進來,默認爲1,進來dfs的條件就是grid[i][j]=1
        num += dfs(i+1,j, grid);
        num += dfs(i-1,j, grid);
        num += dfs(i,j+1, grid);
        num += dfs(i,j-1, grid);
        return num;
    }
}

 

參考LeetCode:

孤島數量:https://leetcode-cn.com/problems/number-of-islands/

島嶼最大面積:https://leetcode-cn.com/problems/max-area-of-island

 

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