携手创作,共同成长!这是我参与「掘金日新计划 · 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.lengthn == grid[i].length1 <= m, n <= 300grid[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/… 。