首页 > 试题广场 >

岛屿的最大面积

[编程题]岛屿的最大面积
  • 热度指数:3024 时间限制:C/C++ 1秒,其他语言2秒 空间限制:C/C++ 256M,其他语言512M
  • 算法知识视频讲解
给定一个用 n*m 矩阵表示的群岛的地图,其中 1 表示岛屿, 0 表示海洋,每个岛屿的水平或竖直方向相邻的岛屿可以视为连在一起的岛屿,每一块岛屿视为面积为 1 ,请问面积最大的岛屿是多少。

例如:
当输入[[1,0],[0,1]]时,对应的地图为:

只有在水平或竖直方向相邻的岛屿可以连在一起,所以每个岛屿互相独立。最大面积是1

当输入[[1,1],[1,0]]时,对应的地图为:

三块岛屿可以连在一起,最大面积是3

数据范围:
示例1

输入

[[1,0],[0,1]]

输出

1

说明

如题面解释  
示例2

输入

[[1,1],[1,0]]

输出

3

说明

如题面解释  
示例3

输入

[[0]]

输出

0
import java.util.*;


public class Solution {
    int now=0;
    int max=0;
    /**
     * 代码中的类名、方法名、参数名已经指定,请勿修改,直接返回方法规定的值即可
     *
     * 
     * @param grid int整型二维数组 
     * @return int整型
     */
    public int maxAreaIsland (int[][] grid) {
        // write code here
        for(int i=0;i<grid.length;i++){
            for(int j=0;j<grid[i].length;j++){
                if(grid[i][j]==1){
                    dfs(grid,i,j);
                }
                now=0;
            }
        }
        return max;
    }
    public void dfs(int[][] grid,int x,int y){
        if(now>max){
            max=now;
        }
        if(x>=0&&x<grid.length&&y>=0&&y<grid[0].length&&grid[x][y]==1){
            now++;
            grid[x][y]=0;
            dfs(grid,x+1,y);
            dfs(grid,x-1,y);
            dfs(grid,x,y+1);
            dfs(grid,x,y-1);
        }
    }
}

发表于 2023-05-18 17:03:16 回复(0)
import java.util.*;


public class Solution {
    /**
     * 代码中的类名、方法名、参数名已经指定,请勿修改,直接返回方法规定的值即可
     *
     * 
     * @param grid int整型二维数组 
     * @return int整型
     */
    int [][] visited;
    int [][] disrs = new int[][] {{0,1},{0,-1},{1,0},{-1,0}};
    public int maxAreaIsland (int[][] grid) {
        // write code here
        //深度优先遍历
        int n = grid.length;   //行
        int m = grid[0].length;  //列
        visited = new int[n][m];
        int maxSquare = 0;
        for(int i = 0; i < n; i++) {
            for(int j = 0; j < m; j++) {
                if(grid[i][j] != '0' && visited[i][j] != 1) {
                    maxSquare = Math.max(dfs(grid,i,j,n,m),maxSquare);
                }
            }
        }
        return maxSquare;
    }
    public int dfs(int[][] grid,int x, int y,int n,int m) {
        int square = 0;
        if(x < 0 || y < 0 || x >= n || y >= m) {
            return 0;
        }
        if(grid[x][y] == 0) {
            return 0;
        }
        if(visited[x][y] == 1) {   //表示已经1遍历过,就不再计算。
            return 0;
        }
        visited[x][y] = 1;
        square++;
        for(int i = 0; i < 4; i++) {
            int nextX = x + disrs[i][0];
            int nextY = y + disrs[i][1];
            square += dfs(grid,nextX,nextY,n,m);
        }
        return square;
    }
}

发表于 2022-06-28 13:33:38 回复(0)
static int c=0;
    public int maxAreaIsland (int[][] grid) {
        int m=0;
        for(int i=0;i<grid.length;i++){
            for(int j=0;j<grid[0].length;j++){
                if(grid[i][j]==1){
                    dfs(i,j,grid);
                    m=Math.max(m,c);
                    c=0;
                }
            }
        }
        return m;
    }
    void dfs(int x, int y, int[][] grid){
        if(x<0 || y<0 || x>=grid.length || y>=grid[0].length)return;
        if(grid[x][y]==0)return;
        c++;
        grid[x][y]=0;
        dfs(x+1,y,grid);
        dfs(x,y+1,grid);
        dfs(x,y-1,grid);
        dfs(x-1,y,grid);
    }

发表于 2022-06-02 19:19:02 回复(0)