题解 | #岛屿的最大面积#

岛屿的最大面积

http://www.nowcoder.com/practice/5568943d3a08403f932a5e54ec3ece71

题意整理

  • 给定一个用n*m矩阵表示的群岛的地图,其中1表示岛屿,0表示海洋。
  • 求最大的岛屿的面积,两个岛屿相邻算同一个岛屿。

方法一(深度优先搜索)

1.思路整理

  • 遍历所有的岛屿。
  • 如果当前岛屿面积为1,则通过深度优先搜索(利用递归实现),找到与之相邻的所有的岛屿,计算其面积。
  • 统计所有面积中的最大者,作为岛屿的最大面积。

2.代码实现

import java.util.*;

public class Solution {
    /**
     * 代码中的类名、方法名、参数名已经指定,请勿修改,直接返回方法规定的值即可
     *
     * 
     * @param grid int整型二维数组 
     * @return int整型
     */
    public int maxAreaIsland (int[][] grid) {
        int res=0;
        int m=grid.length;
        int n=grid[0].length;
        for(int i=0;i<m;i++){
            for(int j=0;j<n;j++){
                //找到与这个岛相邻所有岛组成的面积,统计最大值
                if(grid[i][j]==1){
                    res=Math.max(res,dfs(grid,i,j));
                }
            }
        }
        return res;
    }
    
    //深度优先搜索
    private int dfs(int[][] grid,int i,int j){
        int m=grid.length;
        int n=grid[0].length;
        //超过边界,或者为0,或者已经访问过,直接返回0
        if(i<0||i>=m||j<0||j>=n||grid[i][j]==0){
            return 0;
        }
        //保证之后再访问的时候,面积不增加
        grid[i][j]=0;
        //向四个方向递归
        return dfs(grid,i-1,j)+dfs(grid,i+1,j)+dfs(grid,i,j-1)+dfs(grid,i,j+1)+1;
    }
}

3.复杂度分析

  • 时间复杂度:需要遍历每一个岛屿一次,最坏情况下,地图上所有的格子都是岛屿,时间复杂度为O(mn)O(m*n)
  • 空间复杂度:需要额外大小为max(m,n)max(m,n)的递归栈,所以空间复杂度是O(max(m,n))O(max(m,n))

方法二(广度优先搜索)

1.思路整理

  • 遍历所有的岛屿。
  • 如果当前岛屿面积为1,则通过广度优先搜索(利用队列实现),找到与之相邻的所有的岛屿,计算其面积。
  • 统计所有面积中的最大者,作为岛屿的最大面积。

图解展示: alt

2.代码实现

import java.util.*;

public class Solution {
    /**
     * 代码中的类名、方法名、参数名已经指定,请勿修改,直接返回方法规定的值即可
     *
     * 
     * @param grid int整型二维数组 
     * @return int整型
     */
    //方向数组
    int[][] dir=new int[][]{{-1,0},{0,1},{1,0},{0,-1}};
    
    public int maxAreaIsland (int[][] grid) {
        int res=0;
        int m=grid.length;
        int n=grid[0].length;
        for(int i=0;i<m;i++){
            for(int j=0;j<n;j++){
                //找到与这个岛相邻所有岛组成的面积,统计最大值
                if(grid[i][j]==1){
                    res=Math.max(res,bfs(grid,i,j));
                }
            }
        }
        return res;
    }
    
    //广度优先搜索
    private int bfs(int[][] grid,int i,int j){
        int m=grid.length;
        int n=grid[0].length;
        Queue<int[]> queue=new LinkedList<>();
        //起始坐标放入队列
        queue.offer(new int[]{i,j});
        int cnt=0;
        while(!queue.isEmpty()){
            int[] cur=queue.poll();
            int x=cur[0];
            int y=cur[1];
            //越界,或者为0,或者已访问
            if(x<0||x>=m||y<0||y>=n||grid[x][y]==0){
                continue;
            }
            //标记为0
            grid[x][y]=0;
            //面积加1
            cnt++;
            //往四个方向搜索
            for(int k=0;k<4;k++){
                int dx=x+dir[k][0];
                int dy=y+dir[k][1];
                //加入到队列
                queue.offer(new int[]{dx,dy});
            }
        }
        return cnt;
    }
}

3.复杂度分析

  • 时间复杂度:需要遍历每一个岛屿一次,最坏情况下,地图上所有的格子都是岛屿,时间复杂度为O(mn)O(m*n)
  • 空间复杂度:最坏情况下,需要额外大小为mnm*n的队列,所以空间复杂度是O(mn)O(m*n)
xqxls的题解 文章被收录于专栏

牛客题解

全部评论

相关推荐

07-18 14:34
门头沟学院 Java
点赞 评论 收藏
分享
Hakasee:我的简历和你的基本一样,上周去了上海,boss投了三百家, 三家线下面试 第一家没有做题,全是八股和项目,因为第一次面试不怎么熟练,挂了 第二家,给你几个题目(①css垂直居中文字,字体每两秒闪烁一下以及点击弹窗,②给你一个链接,实现可视化地图,③然后是八股,图片性能优化,以及对图片app有什么想法),45分钟内做完,然后老板面试) 第三家特别偏僻,有点阴森,到了之后让了一个工位给我,有四个题目,①格式化时间 年月日当前时间星期几② 正则表达式提取新闻文字,③在文本域输入文字生成选择题以及选项④生成商品排版还是什么来着 三家都是不超过50人的小公司 两家线上牛客笔试(卡伦特,七牛云,但是笔试不仅要考前端,还要考后端,算法,甚至数学题 我的建议是如果只做了这两个vue项目且不怎么熟练的情况下,先沉淀沉淀,把react学了,上海好的公司基本都是react查看图片
点赞 评论 收藏
分享
评论
1
收藏
分享

创作者周榜

更多
牛客网
牛客网在线编程
牛客网题解
牛客企业服务