一、需求
-
给你一个由 '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
提示:
m == grid.length
n == grid[i].length
1 <= m, n <= 300
grid[i][j] 的值为 '0' 或 '1'
二、DFS
2.1 思路分析
- 根据题意可以得到:①给定矩阵的四周全为'0',即被水包围;②被水包围的相连陆地称为1个岛屿,相连是指在水平或垂直方向上相邻;
- 现在要设计一个算法计算满足情况②的岛屿个数,可以这样做,遍历给定矩阵,判断当前位置是否为陆地,如果是那么累加到岛屿数量,并更新与其相连的所有陆地,用水淹没这些陆地,因为这些陆地已经合并到一个岛屿了;
- 最后返回岛屿数量即可;
2.2 代码实现
class Solution {
public int numIslands(char[][] grid) {
int m = grid.length;
int n = grid[0].length;
int count = 0;
for(int i = 0; i < m; i++) {
for(int j = 0; j < n; j++) {
if(grid[i][j] == '1') {
count++;
dfs(grid, i, j);
}
}
}
return count;
}
public void dfs(char[][] grid, int i, int j) {
if(i < 0 || i >= grid.length || j < 0 || j >= grid[0].length) {
return;
}
if(grid[i][j] == '0') {
return;
}
grid[i][j] = '0';
dfs(grid, i-1, j);
dfs(grid, i, j+1);
dfs(grid, i+1, j);
dfs(grid, i, j-1);
}
}
2.3 复杂度分析
- 时间复杂度为O(mn);
- 空间复杂度为O(mn),最坏情况下,整个网格都是陆地;
三、学习地址
作者:LeetCode
链接:https://leetcode-cn.com/problems/number-of-islands/solution/dao-yu-shu-liang-by-leetcode/