Day 50 695. 岛屿的最大面积

695. 岛屿的最大面积

题目

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
给你一个大小为 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
 

提示:

m == grid.length
n == grid[i].length
1 <= m, n <= 50
grid[i][j] 为 01

题目思路

  • 1、dfs 常规解法,但是题目中 dfs 在 main 函数内递归,局部变量不能重名,重名会导致错误!
  • 2、本题由于题目设置是岛屿并使用 0 或 1 表示,故可以不设置访问数组,一般 dfs 需要设置 bool 类型的访问数组来表示是否访问此单位。
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
class Solution {
public:
int maxAreaOfIsland(vector<vector<int>>& grid) {
int ans = 0;
int n = grid.size(), m = grid[0].size();
for(int i = 0; i < grid.size(); ++i)
{
for(int j = 0; j < grid[0].size(); ++j)
{
if (grid[i][j] == 1)
ans = max(dfs(grid, i, j), ans);
}
}
return ans;
}

int dfs(vector<vector<int>>& grid, int i, int j)
{
int ans = 0;
int l = grid.size(), r = grid[0].size();
if(i >= l || i < 0 || j >= r || j < 0 || grid[i][j] == 0)
return 0;
else
{
ans++;
grid[i][j] = 0;
ans += dfs(grid, i + 1, j);
ans += dfs(grid, i, j + 1);
ans += dfs(grid, i - 1, j);
ans += dfs(grid, i, j - 1);
}

return ans;
}
};

复杂度

  • 时间复杂度:O(m * n)

  • 空间复杂度:O(1)


Day 50 695. 岛屿的最大面积
https://chaggle.github.io/2021/10/29/Leetcode/91-day/day-50/
作者
chaggle
发布于
2021年10月29日
许可协议