当前位置:网站首页>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分别为行数和列数
参考
边栏推荐
- How to technically ensure the quality of LED display?
- Multithreading (Basic) - 40,000 word summary
- How to choose a truly "easy-to-use, high-performance" remote control software
- Mysql环境变量的配置(详细图解)
- 软件工程国考总结——选择题
- The 38-year-old daughter is not in love and has no stable job, the old mother is crying
- 365天挑战LeetCode1000题——Day 047 设计循环队列 循环队列
- 通过方法引用获取方法名
- LayaBox---TypeScript---Three slash instructions
- Turning and anti-climbing attack and defense
猜你喜欢

C#/VB.NET to add more lines more columns image watermark into the Word document

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

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

C#/VB.NET 添加多行多列图片水印到Word文档

Deep Learning 100 Examples - Convolutional Neural Network (CNN) for mnist handwritten digit recognition

OLED的HAL库代码介绍及使用(stm32f1/I2C/HAL库版/100%一次点亮)

多大数量级会出现哈希碰撞

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

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

阿里CTO程立:阿里巴巴开源的历程、理念和实践
随机推荐
MSYS2 QtCreator Clangd 代码分析找不到 mm_malloc.h的问题补救
SQL 数据更新
爆款视频怎么做?这里或许有答案!
翁恺C语言程序设计网课笔记合集
流动性质押挖矿系统开发如何制作?单双币系统开发成熟技术
神通数据库,批量插入数据的时候失败
21 Days Learning Challenge - Day 1 Punch (Screen Density)
LayaBox---TypeScript---声明合并
STM32+MPU6050 Design Portable Mini Desktop Clock (Automatically Adjust Time Display Direction)
阿里云数据存储生态计划发布,助力伙伴数据创新
LayaBox---TypeScript---Namespaces and modules
games202:三,实时环境光照IBL + PRT
10份重磅报告 — 展望中国数字经济未来
软件工程国考总结——选择题
Oracle 单实例19.11升级到19.12
How to encapsulate the wx.request() request of WeChat applet
3D激光slam:LeGO-LOAM---地面点提取方法及代码分析
Oracle根据时间查询
LayaBox---TypeScript---Symbols
Turning and anti-climbing attack and defense