leetcode:695. 岛屿的最大面积

题目

给你一个大小为 m x n 的二进制矩阵 grid
岛屿 是由一些相邻的 1 (代表土地) 构成的组合,这里的「相邻」要求两个 1 必须在 水平或者竖直的四个方向上 相邻。你可以假设 grid 的四个边缘都被 0(代表水)包围着。
岛屿的面积是岛上值为 1 的单元格的数目。
计算并返回 grid 中最大的岛屿面积。如果没有岛屿,则返回面积为 0

示例 1:
[中等] 695. 岛屿的最大面积 - 图1

  1. 输入:grid = [[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]]
  2. 输出:6
  3. 解释:答案不应该是 11 ,因为岛屿只能包含水平或垂直这四个方向上的 1

示例 2:

输入:grid = [[0,0,0,0,0,0,0,0]]
输出:0

解答 & 代码

[中等] 200. 岛屿数量
和上题的思路基本完全一致,区别就在于每次 dfs 淹没一个岛屿的虽有陆地单元格时,还要统计这个岛屿陆地单元格的个数

class Solution {
private:
    // 深度优先搜索淹没 (row, col) 所在的岛屿
    // 即,从位置 (row, col) 开始,将与之相邻的都置 0(淹没)
    // 返回值为岛屿面积
    int dfs(vector<vector<int>>& grid, int row, int col)
    {
        int rows = grid.size();
        int cols = grid[0].size();
        // 递归结束条件:越界 or 已经是海水
        if(row < 0 || row >= rows || col < 0 || col >= cols || grid[row][col] == 0)
            return 0;
        // 将 (row, col) 位置置 0,即将当前格子淹没
        grid[row][col] = 0;
        // 递归搜索上、下、左、右,将当前岛屿的每个位置都变为 0(淹没)
        // 并返回岛屿面积
        return 1 + dfs(grid, row - 1, col) +
                    dfs(grid, row + 1, col) +
                    dfs(grid, row, col - 1) + 
                    dfs(grid, row, col + 1);
    }
public:
    int maxAreaOfIsland(vector<vector<int>>& grid) {
        if(grid.size() == 0 || grid[0].size() == 0)
            return 0;
        int rows = grid.size();
        int cols = grid[0].size();

        int maxArea = 0;    // 最大岛屿的面积
        for(int row = 0; row < rows; ++row)
        {
            for(int col = 0; col < cols; ++col)
            {
                if(grid[row][col] == 1)
                {
                    // 淹没当前格子所在的岛屿,并统计该岛屿的面积
                    int area = dfs(grid, row, col);
                    maxArea = max(area, maxArea);
                }
            }
        }
        return maxArea;
    }
};

复杂度分析:设矩阵 M 行 N 列

  • 时间复杂度 O(MN)
  • 空间复杂度 O(MN):在最坏情况下,整个网格均为陆地,深度优先搜索的深度达到 MN,即空间复杂度达到 O(MN)

执行结果:

执行结果:通过

执行用时:12 ms, 在所有 C++ 提交中击败了 92.49% 的用户
内存消耗:22.4 MB, 在所有 C++ 提交中击败了 98.99% 的用户