LeetCode 695. 岛屿的最大面积

给定一个包含了一些 0 和 1 的非空二维数组 grid , 一个 岛屿 是由四个方向 (水平或垂直) 的 1 (代表土地) 构成的组合。你可以假设二维矩阵的四个边缘都被水包围着。
找到给定的二维数组中最大的岛屿面积。(如果没有岛屿,则返回面积为 0)

示例 1:

1
2
3
4
5
6
7
8
[[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:

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

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

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

题解:
遍历二维数组,遇到 1 的时候就 DFS 深搜找出这个岛屿的面积,同时把经过的 1 都置为 0,避免重复搜索。

代码:

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
int max(int a, int b)
{
return a > b ? a : b;
}

int dfs(int** grid, int m, int n, int i, int j)
{
int ans = 1;
grid[i][j] = 0;
if(i-1 >= 0 && grid[i-1][j])
ans += dfs(grid, m, n, i-1, j);
if(j-1 >= 0 && grid[i][j-1])
ans += dfs(grid, m, n, i, j-1);
if(i+1 < m && grid[i+1][j])
ans += dfs(grid, m, n, i+1, j);
if(j+1 < n && grid[i][j+1])
ans += dfs(grid, m, n, i, j+1);
return ans;
}

// 注意下面 gridSize 是行数,*gridColSize 是列数(不知道 LeetCode 为什么这么给参数)
int maxAreaOfIsland(int** grid, int gridSize, int* gridColSize)
{
int maxArea = 0;
for(int i = 0; i < gridSize; ++i)
for(int j = 0; j < *gridColSize; ++j)
if(grid[i][j])
maxArea = max(maxArea, dfs(grid, gridSize, *gridColSize, i, j));
return maxArea;
}

P.S.

今天才发现 LeetCode 的「每日 1 题」打卡刷题活动,其实从三月一号就开始了。今天第一天做就碰上这道水题😁。