给定一个包含了一些 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。
注意: 给定的矩阵grid 的长度和宽度都不超过 50。
思路:可以用dfs或者bfs来做
代码:
DFS:
/**
* @param {number[][]} grid
* @return {number}
*/
var maxAreaOfIsland = function(grid) {
let row=grid.length;
let col=grid[0].length;
let ans=0;
let res=0;
let dx=[-1,1,0,0];
let dy=[0,0,-1,1];
function dfs(x,y) {
if(x<0 || x>=row || y<0 || y>=col || grid[x][y]==0) return 0;
grid[x][y]=0;
ans = 1;
for(let i=0;i<dx.length;i++) {
ans+=dfs(x+dx[i],y+dy[i]);
}
return ans;
}
for(let i=0;i<row;i++) {
for(let j=0;j<col;j++) {
res=Math.max(res,dfs(i,j));
}
}
return res;
};
BFS:
/**
* @param {number[][]} grid
* @return {number}
*/
var maxAreaOfIsland = function(grid) {
let row=grid.length;
let col=grid[0].length;
let ans=0;
let res=0;
let dx=[-1,1,0,0];
let dy=[0,0,-1,1];
let queue=[];
for(let i =0;i<row;i++) {
for(let j=0;j<col;j++) {
if(grid[i][j]==0) continue;
queue.push([i,j]);
res=0;
while(queue.length>0) {
let [x,y] =queue.shift();
if(x<0 || x>=row || y<0 || y>=col || grid[x][y]==0) continue;
res++;
grid[x][y]=0;
for(let k=0;k<dx.length;k++) {
queue.push([x+dx[k],y+dy[k]]);
}
}
ans=Math.max(res,ans);
}
}
return ans;
};