给定一个包含了一些 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。注意答案不应该是11,因为岛屿只能包含水平或垂直的四个方向的‘1’。
示例 2:
[[0,0,0,0,0,0,0,0]]
对于上面这个给定的矩阵, 返回 0。
注意: 给定的矩阵grid 的长度和宽度都不超过 50。
private static int m, n;
private static int[][] direction = {{0, 1}, {0, -1}, {1, 0}, {-1, 0}};
public static void main(String[] args) {
int [][]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}
};
System.out.println(maxAreaOfIsland(grid));
}
public static int maxAreaOfIsland(int[][] grid) {
m=grid.length;//岛屿的宽度
n=grid[0].length;//岛屿的长度
int max=0;
for(int i=0;i<m;i++) {
for(int j=0;j<n;j++) {
max=Math.max(max, dfs(grid,i,j));
}
}
return max;
}
//深度优先搜索,从某点开始搜索,r是上下方向,c是左右方向
private static int dfs(int[][] grid, int r, int c) {
if(r<0||r>=m||c<0||c>=n||grid[r][c]==0) {
return 0;
}
grid[r][c]=0;//标记已经遍历
int area=1;
//考虑四个方向,r+d[0]--在上下方向加减
for(int []d:direction) {
area+=dfs(grid,r+d[0],c+d[1]);
}
return area;
}