题解 | 岛屿数量
题干分析:
题目给予我们一个只由数字0和1组成的二维数组,要求我们返回这个二维数组在逻辑上有多少块相邻的1
算法思路:
经典的BFS例题,直接遍历所有节点,只要遇到1就增加计数并开始BFS巡岛将所有相邻的1消灭,遍历完成后返回计数结果即可。
实现代码:
int numIslands(vector<vector<char>>& grid) {
int ans = 0;
for (int i = 0; i < grid.size(); i++) {
for (int j = 0; j < grid[0].size(); j++) {
if (grid[i][j] == '1') { // 找到陆地,开始巡岛
ans++;
queue<pair<int, int> > q; // 待处理
q.emplace(i, j); // 启动
grid[i][j] = '0';
// BFS
while (!q.empty()) {
auto [x, y] = q.front();
q.pop();
if (x > 0 && grid[x - 1][y] == '1') {
q.emplace(x - 1, y);
grid[x - 1][y] = '0';
}
if (x < grid.size() - 1 && grid[x + 1][y] == '1') {
q.emplace(x + 1, y);
grid[x + 1][y] = '0';
}
if (y > 0 && grid[x][y - 1] == '1') {
q.emplace(x, y - 1);
grid[x][y - 1] = '0';
}
if (y < grid[0].size() - 1 && grid[x][y + 1] == '1') {
q.emplace(x, y + 1);
grid[x][y + 1] = '0';
}
}
}
}
}
return ans;
}
复杂度分析:
- 时间复杂度:每个数组元素最多被访问常数次,总计时间复杂度为O(nm)。
- 空间复杂度:暂存队列最多维护2min(n,m)个元素,空间复杂度大致为O(min(n,m))
