1.题目:

给你一个大小为 m x n 的二进制矩阵 grid 。

岛屿 是由一些相邻的 1 (代表土地) 构成的组合,这里的「相邻」要求两个 1 必须在 水平或者竖直的四个方向上 相邻。你可以假设 grid 的四个边缘都被 0(代表水)包围着。

岛屿的面积是岛上值为 1 的单元格的数目。

计算并返回 grid 中最大的岛屿面积。如果没有岛屿,则返回面积为 0 。

 https://leetcode.cn/problems/max-area-of-island/description/

LeetCode 695.岛屿的最大面积_Math

输入: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++;
          }
    }
        }
       
}
}