695. 岛屿的最大面积

695. 岛屿的最大面积

leetcode 695. 岛屿的最大面积


题目:695. 岛屿的最大面积

给定一个包含了一些 0 和 1 的非空二维数组 grid 。

一个 岛屿 是由一些相邻的 1 (代表土地) 构成的组合,这里的「相邻」要求两个 1 必须在水平或者竖直方向上相邻。你可以假设 grid 的四个边缘都被 0(代表水)包围着。

找到给定的二维数组中最大的岛屿面积。(如果没有岛屿,则返回面积为 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。注意答案不应该是 11 ,因为岛屿只能包含水平或垂直的四个方向的 1 。

示例2:

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

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

方法:DFS(深度优先搜索)

思路:DFS(深度优先搜索),遍历矩阵,值为1时进行一次DFS,搜索所有与它水平或垂直相邻的值为1的位置,将已搜索过的1赋值为0,返回1的数量。比较每次DFS返回的结果,将最大的结果返回。

运行数据:执行用时:2 ms,内存消耗:40 MB

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
// LeetCode指定调用方法     
public int maxAreaOfIsland(int[][] grid) {

int maxArea = 0;
for (int i = 0; i < grid.length; i++) {
for (int j = 0; j < grid[0].length; j++) {

// 值为1时进行一次DFS
if (grid[i][j] == 1) {
maxArea = Math.max(maxArea, dfs(grid, i, j));
}
}
}
return maxArea;
}

// DFS
private int dfs(int[][] grid, int a, int b) {

// 该位置已超出矩阵限制或该位置值为0,结束搜索
if (a < 0 || b < 0 || a >= grid.length || b >= grid[0].length || grid[a][b] == 0) {
return 0;
}

// 将已搜索过的1赋值为0
grid[a][b] = 0;


// 记录1的个数
int area = 1;

// 递归搜索4个方向
area += dfs(grid, a + 1, b);
area += dfs(grid, a - 1, b);
area += dfs(grid, a, b + 1);
area += dfs(grid, a, b - 1);

return area;
}

学习所得,资料、图片部分来源于网络,如有侵权,请联系本人删除。

才疏学浅,若有错误或不当之处,可批评指正,还请见谅!


 
Your browser is out-of-date!

Update your browser to view this website correctly. Update my browser now

×