题目描述
给你一个由 '1'
(陆地)和 '0'
(水)组成的的二维网格,请你计算网格中岛屿的数量。
岛屿总是被水包围,并且每座岛屿只能由水平方向或竖直方向上相邻的陆地连接形成。
此外,你可以假设该网格的四条边均被水包围。
样例
输入:
11110
11010
11000
00000
输出:1
输入:
11000
11000
00100
00011
输出:3
算法
(深度优先遍历) $O(nm)$
- 从任意一个陆地点开始,即可通过四连通的方式,深度优先搜索遍历到所有与之相连的陆地,即遍历完整个岛屿。每次将遍历过的点清 0。
- 重复以上过程,可行起点的数量就是答案。
时间复杂度
- 由于每个点最多被遍历一次,故时间复杂度为 $O(mn)$。
空间复杂度
- 最坏情况下,需要额外 $O(mn)$ 的空间作为系统栈。
C++ 代码
class Solution {
public:
int dx[4] = {0, 1, 0, -1};
int dy[4] = {-1, 0, 1, 0};
void dfs(int x, int y, vector<vector<char>>& grid) {
int m = grid.size(), n = grid[0].size();
grid[x][y] = '0';
for (int i = 0; i < 4; i++) {
int tx = x + dx[i], ty = y + dy[i];
if (tx < 0 || tx >= m || ty < 0 || ty >= n)
continue;
if (grid[tx][ty] == '0')
continue;
dfs(tx, ty, grid);
}
}
int numIslands(vector<vector<char>>& grid) {
int m = grid.size();
if (m == 0)
return 0;
int n = grid[0].size();
int ans = 0;
for (int i = 0; i < m; i++)
for (int j = 0; j < n; j++)
if (grid[i][j] == '1') {
ans++;
dfs(i, j, grid);
}
return ans;
}
};
借楼贴一个
BFS
的解法hh,DFS
和BFS
详解 见 详细题解:-
DFS
:时间 O(mn), 空间 O(mn
)-
BFS
:时间 O(mn), 空间 O(min(m, n)
)摸大佬!
膜