LeetCode-岛屿的最大面积

题目:

给定一个包含了一些 0 和 1的非空二维数组 grid , 一个 岛屿 是由四个方向 (水平或垂直) 的 1 (代表土地) 构成的组合。你可以假设二维矩阵的四个边缘都被水包围着。

找到给定的二维数组中最大的岛屿面积。(如果没有岛屿,则返回面积为0。)

示例 1:

[[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(标记的粗体的 1)。注意答案不应该是11,因为岛屿只能包含水平或垂直的四个方向的‘1’。

示例 2:

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

对于上面这个给定的矩阵, 返回 0

注意: 给定的矩阵 grid 的长度和宽度都不超过 50。

题目分析:

使用递归调用,我们主要看deep方法:如果当前位置为1的话,就把当前位置的数置为0,表示已经扫描过了(也可理解为避免重复扫描)。然后对当前位置的上下左右分别进行递归搜索即可。注意的是要先判断一下边界问题,以及没有土地的情况下返回0的问题。

PS:可以说是第一次写深度优先这种题目。以前只是看算法书上的,有点印象,但要自己写,还真写不出来。今天碰到了,借鉴的人家的经验,然后自己敲了一遍,很来感觉喔。

Java代码如下:

class Solution {
    public int maxAreaOfIsland(int[][] grid) {
        if (grid.length < 1 || grid[0].length < 1) {
            return 0;
        }
        int max = 0;
        for (int i = 0;i < grid.length;i++) {
            for (int j = 0;j < grid[0].length;j++) {
                int num = deepS(grid, i, j);
                max = max > num ? max : num;
            }
        }
        return max;
    }
    
    public int deepS(int[][] grid, int i, int j) {
        if (i >= 0 && i < grid.length && j >=0 && j < grid[0].length && grid[i][j] == 1) {
            grid[i][j] = 0;
            int num = 1 + deepS(grid, i + 1, j)
                    + deepS(grid, i - 1, j)
                    + deepS(grid, i, j + 1)
                    + deepS(grid, i, j - 1);
            return num;
        } else {
            return 0;
        }
    }
}

你可能感兴趣的:(LeetCode-岛屿的最大面积)