写点什么

算法之统计岛屿数量

用户头像
Skysper
关注
发布于: 2021 年 06 月 13 日
题目信息
给你一个由 '1'(陆地)和 '0'(水)组成的的二维网格,请你计算网格中岛屿的数量。岛屿总是被水包围,并且每座岛屿只能由水平方向和/或竖直方向上相邻的陆地连接形成。此外,你可以假设该网格的四条边均被水包围。
输入:grid = [ ["1","1","1","1","0"], ["1","1","0","1","0"], ["1","1","0","0","0"], ["0","0","0","0","0"]]输出:1
复制代码


DFS 算法实现

通过深度优先算法对于相邻岛屿进行关联标记,实现岛屿数量统计,正常模式,我们通过从左向右、从上倒下两层循环来进行标记处理,但这里有特别的处理点:

class Solution {    public int numIslands(char[][] grid) {        int count = 0;        int height = grid.length;        int w = grid[0].length;        for(int i=0; i < height;i++ ) {            for(int j = 0; j < w; j++) {                if(grid[i][j] == '1') {                    dfs(grid, i, j);                    count++;                }            }        }        return count;    }
public void dfs(char[][] grid, int i, int j) { if(i >= grid.length || i < 0 ) return; if(j < 0 || j >= grid[i].length) return; if(grid[i][j] == '1') { grid[i][j] = '2'; //print(grid); //可以开启打印 dfs(grid, i+1, j); dfs(grid, i, j+1); dfs(grid, i-1, j); dfs(grid, i, j - 1); } }
//打印每个处理过程,标记后的数组效果 private void print(char[][] grid) { for(int i=0;i<grid.length;i++) { for(int j=0; j < grid.length; j++) { System.out.print(grid[i][j] + " "); } System.out.println(""); } System.out.println("---------------------"); }}
复制代码

即在于我们如何如下场景的处理:

        //我们一般从左到由,从上到下进行处理扫描,但是存在一种需要反向处理上一行的情况        //2 0 1       2 0 1     2 0 2        //2 0 1  -->  2 0 2 --> 2 0 2        //2 2 2       2 2 2     2 2 2
复制代码

也就是需要往回处理当前行的上一行或者左边列,是与我们算法方向相反的,这里需要特别注意,也是保证算法有效性的关键 S

        dfs(grid, i-1, j);         dfs(grid, i, j - 1);
复制代码


发布于: 2021 年 06 月 13 日阅读数: 15
用户头像

Skysper

关注

人生不在于谁更优秀,而在于谁更坚持 2016.03.29 加入

还未添加个人简介

评论

发布
暂无评论
算法之统计岛屿数量