刷完LeetCode题库——200. 岛屿数量

97 阅读1分钟

携手创作,共同成长!这是我参与「掘金日新计划 · 8 月更文挑战」的第34天,点击查看活动详情

题目详情

LeetCode题库序号 200. 岛屿数量 ,难度为 中等

Tag : 「广度优先搜索」

给你一个由 '1'(陆地)和 '0'(水)组成的的二维网格,请你计算网格中岛屿的数量。

岛屿总是被水包围,并且每座岛屿只能由水平方向和/或竖直方向上相邻的陆地连接形成。

此外,你可以假设该网格的四条边均被水包围。

示例 1:

输入:grid = [  ["1","1","1","1","0"],
  ["1","1","0","1","0"],
  ["1","1","0","0","0"],
  ["0","0","0","0","0"]
]
输出:1

示例 2:

输入:grid = [  ["1","1","0","0","0"],
  ["1","1","0","0","0"],
  ["0","0","1","0","0"],
  ["0","0","0","1","1"]
]
输出:3

提示:

  • m == grid.length
  • n == grid[i].length
  • 1 <= m, n <= 300
  • grid[i][j] 的值为 '0' 或 '1'

广度优先搜索

题解思路:这道题目是我们上一题的升级版,首先,题目的意思一定要好好看清楚,原先我的理解是统计数组中出现1出现的数量,题目的意思是统计岛屿的数量,岛屿就是由相连的1组成,所以我们在确定一个位置是岛屿所在的位置后,可以使用广度优先搜索去遍历到岛屿上所有的1的位置,直到岛屿的边缘位置,搜索的过程我们需要把对应的1切换成0,这样会防止我们重复统计岛屿的数量。详情见以下代码:

题解代码

class Solution {
    public int numIslands(char[][] grid) {
        int ans = 0;
        if (grid == null || grid.length == 0) {
            return ans;
        }
        int[] dx = new int[]{0, 1, -1, 0};
        int[] dy = new int[]{1, 0, 0, -1};

        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') {
                    ans++;
                    Queue<int[]> queue = new LinkedList<>();
                    queue.offer(new int[] {i, j});
                    grid[i][j] = '0';

                    while (!queue.isEmpty()) {
                    int[] cell = queue.poll();
                    for (int z = 0; z < 4; z++) {
                        int x = cell[0] + dx[z];
                        int y = cell[1] + dy[z];
                        if (x >= 0 && x < m && y >= 0 && y < n && grid[x][y] == '1') {
                            grid[x][y] = '0';
                            queue.offer(new int[] {x, y});
                        }
                    }
                }
                }
            }
        }

        return ans;
        
        
    }
}

结尾

我的"刷完LeetCode题库"系列文章的第 No.200 序号的题目,本次刷题之旅系列开始于 2022-06-12,因为LeetCode上部分是有锁题,我自己的目标是将先把所有不带锁的题目刷完。自己能够通过这次刷题之旅勉励自己,并且提升逻辑思维能力。这个系列的文章就是会见证我自己的一个成长过程!

思路虽然不是最优的,但是我会尽我所能!

为了让我自己的刷题之旅不中断,我特地建立了相关的仓库,来记录我自己的刷题之旅。 github.com/jackpan123/…