岛屿数量

矩阵中多处聚集着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);


    }



全部评论

相关推荐

水墨不写bug:疑似没有上过大学
点赞 评论 收藏
分享
07-17 12:09
门头沟学院 Java
讲的口干舌燥,头都晕了怎么要讲这么长啊
码农索隆:没事,你口干舌燥,他不一定会看,
投递小鹏汽车等公司7个岗位
点赞 评论 收藏
分享
评论
点赞
收藏
分享

创作者周榜

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