岛屿数量

一、题目

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

岛屿总是被水包围,并且每座岛屿只能由水平方向和/或竖直方向上相邻的陆地连接形成。此外,你可以假设该网格的四条边均被水包围。

1
2
3
4
5
6
7
输入:grid = [
["1","1","0","0","0"],
["1","1","0","0","0"],
["0","0","1","0","0"],
["0","0","0","1","1"]
]
输出:3

Leetcode:https://leetcode.cn/problems/number-of-islands

二、分析

这道题目可以使用广度或者深度优先遍历的方式,我们采用广度优先的算法来做。

遍历整个矩阵,如果遍历到 1,那就从四个方向去广度遍历,并且将 1 改为 2。将岛屿数量加一。遍历矩阵时,只有出现 1 时才进行广度搜索,出现 0 和 2 时,都不用理。

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
class Solution {
public:
int numIslands(vector<vector<char>>& grid) {
if (grid.empty()) {
return 0;
}
int len = 0;
for (int i = 0; i < grid.size(); i++) {
for (int j = 0; j < grid[i].size(); j++) {
if (grid[i][j] == '1') {
find_repair(grid, i, j);
len++;
}
}
}
return len;
}

private:
void find_repair(std::vector<std::vector<char>>& grid, int i, int j) {
if (grid[i][j] == '0' || grid[i][j] == '2') {
return;
}
grid[i][j] = '2';
if (i-1 >= 0) find_repair(grid, i-1, j);
if (j-1 >= 0) find_repair(grid, i, j-1);
if (j+1 < grid[i].size()) find_repair(grid, i, j+1);
if (i+1 < grid.size()) find_repair(grid, i+1, j);
}
};