算法日志 --- 12.13---岛屿数量

62 阅读2分钟

开启掘金成长之旅!这是我参与「掘金日新计划 · 12 月更文挑战」的第22天,点击查看活动详情

不知不觉已经周二了,但是公司现在岌岌可危啊,人人都是小羊人

岛屿数量

该题出自力扣的200题 —— 岛屿数量【中等题】

审题

给你一个由 '1'(陆地)和 '0'(水)组成的的二维网格,请你计算网格中岛屿的数量。 岛屿总是被水包围,并且每座岛屿只能由水平方向和/或竖直方向上相邻的陆地连接形成。 此外,你可以假设该网格的四条边均被水包围。

  • 这道题的题意很简单,虽然是中等题,但比较容易理解,给出一个二维的字符数组,字符数组内只有0和1两种字符,1的字符代表的是陆地,0的字符代表的是海洋,就是拿出岛屿的数量,所谓的岛屿就是指四面环海,没法延伸
  • 那么根据题意,只要陆地的四周,也就是上下左右都存在陆地的话,那么就可以延伸岛屿,直到遇到海洋为止
  • 遍历二维数组,判断如果当前的下标值是1,也就是陆地的话,那么进入计算函数
    • 计算函数也就是计算当前岛屿的延伸程度,并且把延伸程度 映射值设为2,作为已被计算的标识
    • 本质上是使用的递归方法,其实就是一个递归标注的过程,它会将所有相连的1都标注成2。
  • 我们可以扫描整个二维网格。如果一个位置为 11,则以其为起始节点开始进行深度优先搜索。

编码

class Solution {
public int numIslands(char[][] grid) {
        int island = 0;
        for (int i = 0; i < grid.length; i++) {
            for (int j = 0; j < grid[0].length; j++) {
                if (grid[i][j] == '1'){
                    check(grid,i,j);
                    island++;
                }
            }
        }
        return island;
    }

    private void check(char[][] grid, int i, int j) {
        if (i < 0 || j < 0 || i>= grid.length || j >= grid[0].length || grid[i][j] != '1')return;
        grid[i][j] = '2';
        check(grid,i - 1,j);
        check(grid,i + 1,j);
        check(grid,i,j + 1);
        check(grid,i,j - 1);
    }
}

image.png