题目:
给定一个包含了一些 0 和 1的非空二维数组 grid
, 一个 岛屿 是由四个方向 (水平或垂直) 的 1
(代表土地) 构成的组合。你可以假设二维矩阵的四个边缘都被水包围着。
找到给定的二维数组中最大的岛屿面积。(如果没有岛屿,则返回面积为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
(标记的粗体的 1)。注意答案不应该是11,因为岛屿只能包含水平或垂直的四个方向的‘1’。
示例 2:
[[0,0,0,0,0,0,0,0]]
对于上面这个给定的矩阵, 返回 0
。
注意: 给定的矩阵 grid
的长度和宽度都不超过 50。
题目分析:
使用递归调用,我们主要看deep方法:如果当前位置为1的话,就把当前位置的数置为0,表示已经扫描过了(也可理解为避免重复扫描)。然后对当前位置的上下左右分别进行递归搜索即可。注意的是要先判断一下边界问题,以及没有土地的情况下返回0的问题。
PS:可以说是第一次写深度优先这种题目。以前只是看算法书上的,有点印象,但要自己写,还真写不出来。今天碰到了,借鉴的人家的经验,然后自己敲了一遍,很来感觉喔。
Java代码如下:
class Solution {
public int maxAreaOfIsland(int[][] grid) {
if (grid.length < 1 || grid[0].length < 1) {
return 0;
}
int max = 0;
for (int i = 0;i < grid.length;i++) {
for (int j = 0;j < grid[0].length;j++) {
int num = deepS(grid, i, j);
max = max > num ? max : num;
}
}
return max;
}
public int deepS(int[][] grid, int i, int j) {
if (i >= 0 && i < grid.length && j >=0 && j < grid[0].length && grid[i][j] == 1) {
grid[i][j] = 0;
int num = 1 + deepS(grid, i + 1, j)
+ deepS(grid, i - 1, j)
+ deepS(grid, i, j + 1)
+ deepS(grid, i, j - 1);
return num;
} else {
return 0;
}
}
}