大家好!我是曾续缘🙂
今天是《LeetCode 热题 100》系列
发车第 51 天
图论第 1 题
❤️点赞 👍 收藏 ⭐再看,养成习惯
给你一个由
'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'
解题方法
这道题目是一个经典的深度优先搜索(DFS)问题,用于计算岛屿的数量。在给定的二维网格中,每个'1'代表陆地,每个'0'代表水域,相邻的陆地(水平或竖直方向上相邻)可以连接成一座岛屿。
为什么使用深度优先搜索方法呢?因为DFS非常适合解决网格连通性的问题,它能够从一个起始点出发,尽可能深入地访问每一个相邻节点,直到无法再继续深入为止。当然广度优先搜索方法也行,不过没有DFS实现起来简洁。
我们可以遍历整个二维网格,将与每个陆地节点相连的其他陆地节点标记为已访问('0')。最终,岛屿的数量就等于我们进行DFS操作的次数,DFS操作可以确保每个岛屿只会被计数一次,最终得出岛屿的数量。
Code
查看代码
java
class Solution {
void dfs(char[][] grid, int i, int j){
int m = grid.length, n = grid[0].length;
if(i < 0 || i >= m || j < 0 || j >= n || grid[i][j] == '0'){
return;
}
grid[i][j] = '0';
dfs(grid, i - 1, j);
dfs(grid, i + 1, j);
dfs(grid, i, j - 1);
dfs(grid, i, j + 1);
}
public int numIslands(char[][] grid) {
int m = grid.length, n = grid[0].length;
int ans = 0;
for(int i = 0; i < m; i++){
for(int j = 0; j < n; j++){
if(grid[i][j] == '1'){
ans++;
dfs(grid, i, j);
}
}
}
return ans;
}
}