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

【LeetCode 热题100】BFS/DFS 实战:岛屿数量 腐烂的橘子(力扣200 / 994 )(Go语言版)

🌊 BFS/DFS 实战:岛屿数量 & 腐烂的橘子(LeetCode 200 & 994)

两道图论基础题,涉及 BFS 与 DFS 的应用,主要用于掌握二维网格中遍历与标记访问的技巧:

  • 🏝️ 200. 岛屿数量(Number of Islands)
  • 🍊 994. 腐烂的橘子(Rotting Oranges)

🏝️ 一、200. 岛屿数量

📌 题目描述

给定一个由 '1'(陆地)和 '0'(水)组成的二维网格,计算岛屿的数量。

岛屿总是由相邻的陆地连接组成(水平或垂直),并且被水包围。


💡 解题思路

这道题的核心是:对每一个未被访问的陆地进行一次 DFS 或 BFS,将整块陆地标记为已访问,岛屿数量 +1

✅ 方法一:DFS 深度优先遍历
  • 从每个为 '1' 的位置出发,递归淹没它相邻的陆地;
  • 每次新的 DFS 开始,即发现了一个新的岛屿。
func numIslands(grid [][]byte) int {m, n := len(grid), len(grid[0])var dfs func(int, int)dfs = func(i, j int) {if i < 0 || j < 0 || i >= m || j >= n || grid[i][j] == '0' {return}grid[i][j] = '0'dfs(i+1, j)dfs(i-1, j)dfs(i, j+1)dfs(i, j-1)}count := 0for i := 0; i < m; i++ {for j := 0; j < n; j++ {if grid[i][j] == '1' {dfs(i, j)count++}}}return count
}
✅ 方法二:BFS 广度优先遍历
  • 使用队列,每次将 '1' 入队后,通过四个方向将邻接陆地逐个加入队列。

🧠 小结

技术点说明
核心思想将一整块陆地用 DFS/BFS 访问并标记
遍历方式DFS / BFS 均可
时间复杂度O(m × n)
空间复杂度DFS:O(m × n)(递归栈),BFS:队列空间

🍊 二、994. 腐烂的橘子

📌 题目描述

在一个二维网格中:

  • 0 代表空单元格,
  • 1 代表新鲜橘子,
  • 2 代表腐烂橘子。

每分钟,所有腐烂橘子会让上下左右相邻的新鲜橘子变腐烂
求腐烂完所有橘子的最短分钟数,如果无法全部腐烂,返回 -1


💡 解题思路

这是标准的多源 BFS 问题,初始队列中包含所有腐烂橘子的位置,然后每轮向周围传播。

✅ 步骤总结:
  1. 初始化队列,将所有腐烂橘子的坐标加入;
  2. 记录新鲜橘子的数量 fresh
  3. 每轮扩散一层(即一分钟),对新鲜橘子变腐烂,fresh--
  4. 最终看 fresh 是否为 0,若是返回分钟数,否则返回 -1。

📦 Go 实现
type pair struct{ x, y int }func orangesRotting(grid [][]int) int {m, n := len(grid), len(grid[0])queue := []pair{}fresh := 0for i := 0; i < m; i++ {for j := 0; j < n; j++ {if grid[i][j] == 2 {queue = append(queue, pair{i, j})} else if grid[i][j] == 1 {fresh++}}}dirs := []pair{{0, 1}, {1, 0}, {0, -1}, {-1, 0}}minutes := 0for len(queue) > 0 && fresh > 0 {size := len(queue)for i := 0; i < size; i++ {curr := queue[0]queue = queue[1:]for _, d := range dirs {x, y := curr.x + d.x, curr.y + d.yif x >= 0 && y >= 0 && x < m && y < n && grid[x][y] == 1 {grid[x][y] = 2fresh--queue = append(queue, pair{x, y})}}}minutes++}if fresh > 0 {return -1}return minutes
}

⚠️ 注意事项

  • 初始化时要统计新鲜橘子的数量
  • 每一轮是批量扩散(多源 BFS)
  • 不能单独计数某个腐烂橘子的时间,要整体一起推进。

🔚 总结对比

特性岛屿数量(200)腐烂的橘子(994)
模型连通块计数最短传播路径,多源 BFS
算法DFS / BFSBFS(层级扩散)
是否需要标记访问
特别关注连通性与计数初始状态和时间控制


文章转载自:

http://g7GICfbR.mstrb.cn
http://4KD7noNP.mstrb.cn
http://58Gqrsa3.mstrb.cn
http://jOqlz6f1.mstrb.cn
http://eI1yqc4M.mstrb.cn
http://JjWpZMD8.mstrb.cn
http://2JqwyqUH.mstrb.cn
http://gJOVJruR.mstrb.cn
http://KBfMVizd.mstrb.cn
http://rOUtxoEL.mstrb.cn
http://LIfqlTW8.mstrb.cn
http://l7uRui5g.mstrb.cn
http://nGuN1kvY.mstrb.cn
http://c9VYHTem.mstrb.cn
http://msQPEt0A.mstrb.cn
http://fNe1itQU.mstrb.cn
http://O9Zz4jft.mstrb.cn
http://C7vS5P13.mstrb.cn
http://d7JIdI26.mstrb.cn
http://mpz3skh9.mstrb.cn
http://KfR66V04.mstrb.cn
http://fJUDKQ93.mstrb.cn
http://viDBOdjR.mstrb.cn
http://JZcvN694.mstrb.cn
http://xaY8jUtC.mstrb.cn
http://sfxUbQ5y.mstrb.cn
http://vmEj8d5z.mstrb.cn
http://eeCzFyuh.mstrb.cn
http://GTdzBTDP.mstrb.cn
http://rGVbvHz7.mstrb.cn
http://www.dtcms.com/a/227044.html

相关文章:

  • vscode中的markdown表格列宽
  • js的时间循环的讲解
  • Y1——链式前向星
  • mybatisplus的总结
  • 计算机网络 : 应用层自定义协议与序列化
  • 2894. 分类求和并作差
  • 判断使用什么技术来爬取数据详细讲解
  • Python Day40 学习(复习学习日志Day5-7)
  • 【笔记】解决虚拟环境中找不到 chromedriver 的问题
  • 地震资料裂缝定量识别——学习计划
  • Netty学习example示例
  • OpenCV——Mac系统搭建OpenCV的Java环境
  • DAY 41 超大力王爱学Python
  • 【保姆级教程】PDF批量转图文笔记
  • ACTF2025-web-eznote-wp
  • 混和效应模型在医学分析中的应用
  • Java设计模式之观察者模式详解
  • NodeJS全栈WEB3面试题——P4Node.js后端集成 服务端设计
  • 《深度探索C++对象模型》阅读笔记(完整版)
  • 网络攻防技术二:密码学分析
  • Unity + HybirdCLR热更新 入门篇
  • MySQL日志
  • Rust 变量与可变性
  • android binder(1)基本原理
  • Fullstack 面试复习笔记:操作系统 / 网络 / HTTP / 设计模式梳理
  • 短视频平台差异视角下开源AI智能名片链动2+1模式S2B2C商城小程序的适配性研究——以抖音与快手为例
  • 123网盘SDK-npm包已发布
  • Oracle数据库事务学习
  • 【沉浸式求职学习day52】【初识Mybaits】
  • CppCon 2014 学习:0xBADC0DE