1.题目:
给你一个大小为 m x n
的二进制矩阵 grid
。
岛屿 是由一些相邻的 1
(代表土地) 构成的组合,这里的「相邻」要求两个 1
必须在 水平或者竖直的四个方向上 相邻。你可以假设 grid
的四个边缘都被 0
(代表水)包围着。
岛屿的面积是岛上值为 1
的单元格的数目。
计算并返回 grid
中最大的岛屿面积。如果没有岛屿,则返回面积为 0
。
https://leetcode.cn/problems/max-area-of-island/description/
输入: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]]
输出:6
解释:答案不应该是 11 ,因为岛屿只能包含水平或垂直这四个方向上的 1 。
示例 2:
输入:grid = [[0,0,0,0,0,0,0,0]]
输出:0
2.代码:
dfs:
class Solution {
boolean[][] visited;
int count;
int[][] move = {{0,1},{0,-1},{1,0},{-1,0}};
public int maxAreaOfIsland(int[][] grid) {
visited = new boolean[grid.length][grid[0].length];
int res=0;
for(int i=0;i<grid.length;i++){
for(int j=0;j<grid[0].length;j++){
if(visited[i][j]==false && grid[i][j]==1){
count=0;//每一个岛屿都会重新开始计算他的面积
dfs(grid,i,j);
res=Math.max(res,count);//取最后最大岛屿的面积
}
}
}
return res;
}
public void dfs(int[][] grid,int x,int y){
if(visited[x][y]==true || grid[x][y]==0) return;//注意这里也要有条件限制
visited[x][y]=true;
count++;//因为后面每次都会递归,所以这个count是累加的
for(int i=0;i<move.length;i++){
int nextx = x+move[i][0];//注意这里要用原来的坐标加上来
int nexty = y+move[i][1];
if(nextx<0 || nextx>=grid.length || nexty<0 || nexty>=grid[0].length || grid[nextx][nexty]==0) continue;//注意这里不是return
dfs(grid,nextx,nexty);
}
}
}
bfs:
class Solution {
int[][] move = {{1,0},{-1,0},{0,1},{0,-1}};
boolean[][] visited;
int count;
public int maxAreaOfIsland(int[][] grid) {
visited = new boolean[grid.length][grid[0].length];
int res=0;
for(int i=0;i<grid.length;i++){
for(int j=0;j<grid[0].length;j++){
if(visited[i][j]==false && grid[i][j]==1){
count=0;
bfs(grid,i,j);
res=Math.max(res,count);
}
}
}
return res;
}
public void bfs(int[][] grid,int x,int y){
Queue<Integer> queue = new LinkedList<>();
queue.offer(x);//这里放进队列是一个一个放,放一个数组也是可以的
queue.offer(y);
visited[x][y]=true;
count++;
while(!queue.isEmpty()){
int m = queue.poll();//注意这里是要抛出来
int n=queue.poll();
for(int i=0;i<move.length;i++){
int nextx = m+move[i][0];//注意是用抛出来的去加,不是用传进来的x和y
int nexty = n+move[i][1];
if(nextx<0||nexty<0||nextx>=grid.length||nexty>=grid[0].length||grid[nextx][nexty]==0) continue;
if(visited[nextx][nexty]==false&&grid[nextx][nexty]==1){
queue.offer(nextx);
queue.offer(nexty);
visited[nextx][nexty]=true;
count++;
}
}
}
}
}