问题描述
给定一个包含了一些 0 和 1的非空二维数组 grid , 一个 岛屿 是由四个方向 (水平或垂直) 的 1 (代表土地) 构成的组合。你可以假设二维矩阵的四个边缘都被水包围着。
找到给定的二维数组中最大的岛屿面积。(如果没有岛屿,则返回面积为0。)
示例
[[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’。
[[0,0,0,0,0,0,0,0]]
对于上面这个给定的矩阵, 返回 0。
注意: 给定的矩阵grid 的长度和宽度都不超过 50。
思路
没啥好想的。这不类似是严版数据结构的迷宫问题嘛。而且比迷宫问题还要简单。
用DFS和BFS都能做。
还学到了沉岛思想,不过并没有啥卵用。因为不能破坏题目数据。
为了AC拼了。
记得要有一个办法标记已经判定过的数据(剪枝)
BFS(方法一)
DFS(方法二)
方法一
Java版
class Solution {
public int maxAreaOfIsland1(int[][] grid) {
if(grid.length == 0){
return 0;
}
int height = grid.length;
int width = grid[0].length;
boolean[][] isVisited = new boolean[height][width];
int max = 0;
for(int i = 0; i < height; i++){
for(int j = 0; j < width; j++){
if(grid[i][j] == 1 && !isVisited[i][j]){
int tmp = maxArea(grid,isVisited,i,j);
max = Math.max(tmp,max);
}
}
}
return max;
}
private int maxArea(int[][] grid,boolean[][] isVisited, int x,int y){
Queue<Node> queue = new LinkedList<>();
queue.add(new Node(x,y,grid[x][y]));
isVisited[x][y] = true;
int res = 1;
while(!queue.isEmpty()){
Node tmp = queue.poll();
if(0 < tmp.x && !isVisited[tmp.x-1][tmp.y] && grid[tmp.x-1][tmp.y] == 1){
isVisited[tmp.x-1][tmp.y] = true;
queue.add(new Node(tmp.x-1,tmp.y,grid[tmp.x-1][tmp.y]));
res++;
}
if(tmp.x < grid.length-1 && !isVisited[tmp.x+1][tmp.y] && grid[tmp.x+1][tmp.y] == 1){
isVisited[tmp.x+1][tmp.y] = true;
queue.add(new Node(tmp.x+1,tmp.y,grid[tmp.x+1][tmp.y]));
res++;
}
if(0 < tmp.y && !isVisited[tmp.x][tmp.y-1] && grid[tmp.x][tmp.y-1] == 1){
isVisited[tmp.x][tmp.y-1] = true;
queue.add(new Node(tmp.x,tmp.y-1,grid[tmp.x][tmp.y-1]));
res++;
}
if(tmp.y < grid[0].length-1 && !isVisited[tmp.x][tmp.y+1] && grid[tmp.x][tmp.y+1] == 1){
isVisited[tmp.x][tmp.y+1] = true;
queue.add(new Node(tmp.x,tmp.y+1,grid[tmp.x][tmp.y+1]));
res++;
}
}
return res;
}
}
class Node{
public int x;
public int y;
public int val;
Node(int x, int y, int val){
this.x = x;
this.y = y;
this.val = val;
}
}
方法二
Java版
public int maxAreaOfIsland(int[][] grid){
if(grid.length == 0) return 0;
int max = 0;
for(int i = 0; i < grid.length; i++){
for(int j = 0; j < grid[0].length; j++){
max = Math.max(max,DFS(grid,i,j));
}
}
return max;
}
private int DFS(int[][] grid, int x, int y){
if(grid[x][y] == 0) return 0;
int res = 1;
grid[x][y] = 0;
if(0<x) res += DFS(grid,x-1,y);
if(x<grid.length-1) res += DFS(grid,x+1,y);
if(0<y) res += DFS(grid,x,y-1);
if(y<grid[0].length-1) res+= DFS(grid,x,y+1);
return res;
}