leetcode:695. 岛屿的最大面积
题目
给你一个大小为 m x n
的二进制矩阵 grid
。
岛屿 是由一些相邻的 1
(代表土地) 构成的组合,这里的「相邻」要求两个 1
必须在 水平或者竖直的四个方向上 相邻。你可以假设 grid
的四个边缘都被 0
(代表水)包围着。
岛屿的面积是岛上值为 1
的单元格的数目。
计算并返回 grid
中最大的岛屿面积。如果没有岛屿,则返回面积为 0
。
示例 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]]
输出:6
解释:答案不应该是 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% 的用户