当前位置: 首页 > news >正文

【LeetCode】200、岛屿数量

【LeetCode】200、岛屿数量

文章目录

  • 一、并查集
    • 1.1 并查集
    • 1.2 多语言解法
  • 二、洪水填充 DFS
    • 2.1 洪水填充 DFS

一、并查集

1.1 并查集

// go
var sets int
var father [90000]intfunc numIslands(grid [][]byte) int {n, m := len(grid), len(grid[0])build(grid, n, m)for i := range n {for j := range m {if grid[i][j] == '1' {if i > 0 && grid[i-1][j] == '1' { // 因为第一行 i == 0, 所以只有 i > 0 时 grid[i-1][j] 才不越界union(idx(m,i,j), idx(m,i-1,j))}if j > 0 && grid[i][j-1] == '1' {union(idx(m,i,j), idx(m,i,j-1))}}}}return sets
}// 编码: 二维变一维, 表示 并查集的 集合编号
// cols 为列的数量
func idx(cols, i, j int) int {return i*cols+j
}// 把1, 新建并查集, 有几个1就有几个集合
func build(grid [][]byte, n, m int) {// 清零全局变量sets = 0for i := range father {father[i] = 0}for i := range n {for j := range m {if grid[i][j] == '1' {idx := idx(m,i,j)father[idx] = idxsets++}}}
}func find(i int) int {if father[i] != i {father[i] = find(father[i])}return father[i]
}func union(a, b int) {fa, fb := find(a), find(b)if fa != fb {father[fa] = fbsets--}
}func isSameSet(a, b int) bool {return find(a) == find(b)
}

参考 左神 并查集

1.2 多语言解法

C p p / G o / P y t h o n / R u s t / J s / T s Cpp/Go/Python/Rust/Js/Ts Cpp/Go/Python/Rust/Js/Ts

// cpp
// go 同上
# python
// rust
// js
// ts

二、洪水填充 DFS

2.1 洪水填充 DFS

若遇到未访问过的陆地则数量++, 并延展此块陆地的最大边界

遇到1则发现岛屿, 通过dfs尽量探索到岛屿的边界, 复杂度O(m*n)

func numIslands(grid [][]byte) (ans int) {m, n := len(grid), len(grid[0])var dfs func(r, c int)   dfs = func(r, c int) { // 延展此块陆地的最大边界if r < 0 || r >= m || c < 0 || c >= n {return} // 递归终止条件:越界(无效的网格),则返回if grid[r][c] != '1' {return} // [非 未访问过的陆地](水or已访问过的陆地),则返回grid[r][c] = '2' // 标记已访问过的陆地:防止无限循环无法退出dfs(r-1, c); dfs(r+1, c); dfs(r, c-1); dfs(r, c+1)}for r := 0; r < m; r++ {for c := 0; c < n; c++ {if grid[r][c] == '1' { // 若遇到一个 [未访问过的陆地],则结果+1,并则将其周围四个相连的陆地变为非陆地ans++dfs(r, c)}}}return
}

参考
参考

http://www.lryc.cn/news/513889.html

相关文章:

  • idea报错:There is not enough memory to perform the requested operation.
  • python ai ReAct 代理(ReAct Agent)
  • HTML入门教程|| HTML 基本标签(2)
  • MySQL root用户密码忘记怎么办(Reset root account password)
  • groovy:多线程 简单示例
  • SOME/IP 协议详解——序列化
  • 三、GIT与Github推送(上传)和克隆(下载)
  • 18.2、网络安全评测技术与攻击
  • 在 ArcGIS Pro/GeoScene Pro 中设计专题地图的符号系统
  • CSS2笔记
  • 移动端如何实现上拉加载
  • 【mysql】linux安装mysql客户端
  • YOLOv5部署到web端(flask+js简单易懂)
  • 【机器学习】深度学习(DNN)
  • 12.30-1-5学习周报
  • 【MySQL】数据操作
  • python数据分析:使用pandas库读取和编辑Excel表
  • 开源轻量级文件分享服务Go File本地Docker部署与远程访问
  • 异步背后的奥秘:事件循环
  • Springboot使用RabbitMQ实现关闭超时订单的一个简单示例
  • 小程序基础 —— 07 创建小程序项目
  • 【Golang 面试题】每日 3 题(十五)
  • Docker命令(用法说明详解)
  • leetcode 热题100(131. 分割回文串)c++
  • vs2022编译opencv 4.10.0
  • Bash 中的 2>1 | tee 命令详解
  • MySQL数据库的日志
  • DataCap 2024.4.1 版本发布:MongoDB 驱动支持、工作流引擎升级
  • 二十三种设计模式-单例模式
  • 【微服务】SpringBoot 国际化适配方案使用详解