当前位置:网站首页>leetcode: 200. Number of islands
leetcode: 200. Number of islands
2022-08-02 11:00:00 【uncle_ll】
200. 岛屿数量
来源:力扣(LeetCode)
链接: https://leetcode.cn/problems/number-of-islands/
给你一个由 '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'
解法
The general idea is to traverse,如果遍历到陆地,岛屿数+1,and change the value of the island to ‘0’Or set the access status to Accessed,based on the land,Spread around,Set the land with the ridge to ‘0’Or set the access status to Accessed
- BFS:The land is stored with a queue,And traverse in four directions,If there is land in the future,进入队列,直到队列为空
- DFS: Traverse in four directions recursively
代码实现
BFS
python实现
class Solution:
def numIslands(self, grid: List[List[str]]) -> int:
if not grid or len(grid[0]) == 0:
return 0
rows = len(grid)
cols = len(grid[0])
count = 0
dr = [(0, 1), (1, 0), (0, -1), (-1, 0)]
for x in range(rows):
for y in range(cols):
if grid[x][y] == '1':
count += 1
queue = [(x, y)]
grid[x][y] = 0
while queue:
cx, cy = queue.pop(0)
for dx, dy in dr:
nx = cx + dx
ny = cy + dy
if 0<= nx < rows and 0 <= ny < cols and grid[nx][ny] == '1':
queue.append((nx, ny))
grid[nx][ny] = '0'
return count
c++实现
class Solution {
public:
int numIslands(vector<vector<char>>& grid) {
int rows = grid.size();
if (rows == 0)
return 0;
int cols = grid[0].size();
if (cols == 0)
return 0;
vector<pair<int, int>> dr;
dr = {
{
1, 0}, {
-1, 0}, {
0, 1}, {
0, -1}};
int count = 0;
for (int i=0; i< rows; i++) {
for (int j=0; j< cols; j++) {
if (grid[i][j] == '1') {
count++;
grid[i][j] = 0;
queue<pair<int, int>> q;
q.push({
i, j});
while (!q.empty()) {
auto cur = q.front();
q.pop();
int x = cur.first;
int y = cur.second;
for (auto d: dr) {
int dx = d.first;
int dy = d.second;
int nx = x + dx;
int ny = y + dy;
if (nx >= 0 && nx < rows && ny >= 0 && ny < cols && grid[nx][ny] == '1'){
q.push({
nx, ny});
grid[nx][ny] = '0';
}
}
}
}
}
}
return count;
}
};
复杂度分析
- 时间复杂度: O ( M N ) O(MN) O(MN) M和N分别为行数和列数
- 空间复杂度: O ( m i n ( M , N ) ) O(min(M, N)) O(min(M,N)) 在最坏情况下,整个网格均为陆地,队列的大小可以达到 min ( M , N ) \min(M, N) min(M,N).
DFS
python实现
class Solution:
def numIslands(self, grid: List[List[str]]) -> int:
if not grid or len(grid[0]) == 0:
return 0
rows = len(grid)
cols = len(grid[0])
count = 0
dr = [(0, 1), (1, 0), (0, -1), (-1, 0)]
for x in range(rows):
for y in range(cols):
if grid[x][y] == '1':
count += 1
queue = [(x, y)]
grid[x][y] = 0
while queue:
cx, cy = queue.pop(0)
for dx, dy in dr:
nx = cx + dx
ny = cy + dy
if 0<= nx < rows and 0 <= ny < cols and grid[nx][ny] == '1':
queue.append((nx, ny))
grid[nx][ny] = '0'
return count
c++实现
class Solution {
private:
void dfs(vector<vector<char>>& grid, int r, int c) {
int nr = grid.size();
int nc = grid[0].size();
grid[r][c] = '0';
if (r - 1 >= 0 && grid[r-1][c] == '1') dfs(grid, r - 1, c);
if (r + 1 < nr && grid[r+1][c] == '1') dfs(grid, r + 1, c);
if (c - 1 >= 0 && grid[r][c-1] == '1') dfs(grid, r, c - 1);
if (c + 1 < nc && grid[r][c+1] == '1') dfs(grid, r, c + 1);
}
public:
int numIslands(vector<vector<char>>& grid) {
int nr = grid.size();
if (!nr) return 0;
int nc = grid[0].size();
int num_islands = 0;
for (int r = 0; r < nr; ++r) {
for (int c = 0; c < nc; ++c) {
if (grid[r][c] == '1') {
++num_islands;
dfs(grid, r, c);
}
}
}
return num_islands;
}
};
复杂度分析
- 时间复杂度: O ( M N ) O(MN) O(MN) M和N分别为行数和列数
- 空间复杂度: O ( M N ) O(MN) O(MN) M和N分别为行数和列数
参考
边栏推荐
猜你喜欢

LeetCode每日一练 —— 225. 用队列实现栈

阿里云数据存储生态计划发布,助力伙伴数据创新

8年软件测试工程师的感悟:与薪资相匹配的永远是实力

字节跳动软件测试岗,收到offer后我却拒绝了~给面试的人一些忠告....

同样做软件测试,和月收入 3W 的学弟聊了一晚上,我彻底崩溃了

games202:三,实时环境光照IBL + PRT

FPGA手撕代码——CRC校验码的多种Verilog实现方式 (2021乐鑫科技数字IC提前批代码编程)

ECCV22|PromptDet:无需手动标注,迈向开放词汇的目标检测

WPF 截图控件之文字(七)「仿微信」

软件测试岗位巨坑?阿里在职7年测试人告诉你千万别上当
随机推荐
从测试入门到测试架构师,这10年,他是这样让自己成才的
程序员的浪漫七夕
如何选择一块真正“好用的、性能高”的远程控制软件
软件工程国考总结——选择题
[Science of Terminology] For those difficult words about the integrated workbench, read this article to understand in seconds!
通过方法引用获取方法名
SVN如何删除文件名包含空格的文件
爆款视频怎么做?这里或许有答案!
配置mysql失败了,这是怎么回事呢?
Turning and anti-climbing attack and defense
LayaBox---TypeScript---迭代器和生成器
mysql清除binlog日志文件
C#/VB.NET to add more lines more columns image watermark into the Word document
从众多接口中脱颖而出的最稳定的接口——淘宝详情api
Nanny Level Tutorial: Write Your Own Mobile Apps and Mini Programs (Part 2)
循环结构--while循环
记一次mysql查询慢的优化历程
阿里CTO程立:阿里巴巴开源的历程、理念和实践
流动性质押挖矿系统开发如何制作?单双币系统开发成熟技术
bgp与mpls综合实验