岛屿数量

矩阵中多处聚集着1,要想统计1聚集的堆数而不重复统计,那我们可以考虑每次找到一堆相邻的1,就将其全部改成0,而将所有相邻的1改成0的步骤又可以使用深度优先搜索(dfs),因此具体做法如下:

step 1:优先判断空矩阵等情况。 step 2:从上到下从左到右遍历矩阵每一个位置的元素,如果该元素值为1,统计岛屿数量。 step 3:使用dfs将遍历矩阵遇到的1以及相邻的1全部置为0。

至于dfs具体怎么操作,我们接着看。当我们遇到矩阵的某个元素为1时,首先将其置为了0,然后查看与它相邻的上下左右四个方向,如果这四个方向相邻元素为1,则进入该元素,进入该元素之后我们发现又回到了刚刚的子问题,又是把这一片相邻区域的1全部置为0,因此可以用递归实现。

终止条件:进入某个元素修改其值为0后,遍历四个方向发现周围都没有1,那就不用继续递归,返回即可,或者递归到矩阵边界也同样可以结束。 返回值:每一级的子问题就是把修改后的矩阵返回,因为其是函数引用,也不用管。 本级任务:对于每一级任务就是将该位置的元素置为0,然后查询与之相邻的四个方向,看看能不能进入子问题。

 public int solve (char[][] grid) {

        int m= grid.length;
        if(m==0) return 0;
        int n= grid[0].length;
        int count=0;
        for (int i=0;i<m;i++){
            for (int j=0;j<n;i++){
                if(grid[i][j]=='1'){
                    count++;
                    dfs(grid,i,j);
                }
            }
        }
        return count;
    }

    public void dfs(char[][] grid,int i,int j){

        int m= grid.length;
        int n=grid[0].length;
        grid[i][j]='0';
        if(i-1>0&&grid[i-1][j]=='1') dfs(grid,i-1,j);
        if(i+1<m&&grid[i+1][j]=='1') dfs(grid,i+1,j);
        if(j-1>0&&grid[i][j-1]=='1') dfs(grid,i,j-1);
        if(j+1<n&&grid[i][j+1]=='1') dfs(grid,i,j+1);


    }



全部评论

相关推荐

不愿透露姓名的神秘牛友
07-15 17:17
听说过付费实习,没想到这么贵啊我去,要不我给你个腰子吧
哈哈哈,你是老六:这种公司一定要注意啊,不要随便签合同,只要签了后面钱可能回不来,而且你通过法律途径也弄不回
点赞 评论 收藏
分享
07-11 15:12
门头沟学院 Java
别人在上班,我就在工位上看看视频啥的,这正常吗?
程序员小白条:实习就是摸鱼,只是公司指标,把你进来了,可能那时候客户很多,但等你进来的时候,已经是淡季了,根本没多少需求,或者说根本不适合实习生去完成,因此你就每天干坐着就行,可能1,2个月都没需求
实习生的蛐蛐区
点赞 评论 收藏
分享
05-27 14:57
西北大学 golang
强大的社畜在走神:27届真不用急,可以搞点项目、竞赛再沉淀沉淀,我大二的时候还在天天打游戏呢
投递华为等公司10个岗位
点赞 评论 收藏
分享
评论
点赞
收藏
分享

创作者周榜

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