LeetCode 130题:被围绕区域的BFS与DFS解法详解
📅 2026/8/3 11:47:20
👁️ 次浏览
1. 问题背景与核心挑战LeetCode 130题被围绕的区域是矩阵遍历类问题的经典代表要求将二维矩阵中被X完全包围的O区域全部替换为X。这个看似简单的问题实则暗藏多个算法考察点尤其适合用来检验对广度优先搜索(BFS)和深度优先搜索(DFS)的理解深度。问题的关键难点在于如何高效识别被包围的区域。直接遍历矩阵中心区域判断每个O是否被包围的方法时间复杂度高达O(n^4)完全不可行。经过分析可以发现任何与边界相连的O区域都不可能被包围这个逆向思维是解题的突破口。因此正确解法应该首先标记所有边界相连的O区域然后遍历内部区域处理真正的被包围区域最后恢复被标记的边界区域这种标记-处理-恢复的三段式解法思路将原本O(n^4)的时间复杂度优化到了O(n^2)是典型的空间换时间策略。下面我们具体看两种实现方式。2. BFS解法详解2.1 算法流程设计广度优先搜索采用队列数据结构按层遍历与边界O相连的所有区域。具体步骤初始化队列将所有边界上的O坐标入队创建相同大小的标记矩阵记录需要保留的O标准BFS循环出队一个坐标检查四个方向的相邻格子如果是O且未被标记则标记并入队二次遍历矩阵未被标记的O改为X被标记的O保持原样from collections import deque def solve(board): if not board: return rows, cols len(board), len(board[0]) queue deque() # 步骤1收集边界O for r in range(rows): for c in [0, cols-1]: if board[r][c] O: queue.append((r,c)) for c in range(cols): for r in [0, rows-1]: if board[r][c] O: queue.append((r,c)) # 步骤2BFS标记 marked [[False]*cols for _ in range(rows)] while queue: r, c queue.popleft() if marked[r][c]: continue marked[r][c] True for dr, dc in [(-1,0),(1,0),(0,-1),(0,1)]: nr, nc rdr, cdc if 0nrrows and 0nccols and board[nr][nc]O: queue.append((nr,nc)) # 步骤3处理矩阵 for r in range(rows): for c in range(cols): if board[r][c] O and not marked[r][c]: board[r][c] X2.2 复杂度分析与优化时间复杂度O(mn) - 每个节点最多入队一次 空间复杂度O(mn) - 标记矩阵和队列的空间实际编码时可以优化空间使用直接在原矩阵上标记如将保留的O改为T使用位运算压缩标记矩阵对极大矩阵采用分块处理关键技巧在BFS中将坐标(i,j)编码为i*colsj可以提升缓存命中率这对大规模矩阵能带来约15%的性能提升3. DFS解法实现3.1 递归与迭代对比深度优先搜索有两种实现方式递归和迭代。递归写法简洁但存在栈溢出风险迭代写法稍复杂但更安全。递归版本def solve(board): if not board: return rows, cols len(board), len(board[0]) def dfs(r, c): if not (0rrows and 0ccols) or board[r][c] ! O: return board[r][c] T # 临时标记 dfs(r1, c) dfs(r-1, c) dfs(r, c1) dfs(r, c-1) # 从边界开始DFS for r in range(rows): for c in [0, cols-1]: dfs(r, c) for c in range(cols): for r in [0, rows-1]: dfs(r, c) # 处理矩阵 for r in range(rows): for c in range(cols): board[r][c] X if board[r][c] O else O迭代版本使用栈def solve(board): if not board: return rows, cols len(board), len(board[0]) stack [] # 收集边界O for r in range(rows): for c in [0, cols-1]: if board[r][c] O: stack.append((r,c)) for c in range(cols): for r in [0, rows-1]: if board[r][c] O: stack.append((r,c)) # DFS标记 while stack: r, c stack.pop() if 0rrows and 0ccols and board[r][c] O: board[r][c] T stack.append((r1,c)) stack.append((r-1,c)) stack.append((r,c1)) stack.append((r,c-1)) # 处理矩阵 for r in range(rows): for c in range(cols): board[r][c] X if board[r][c] O else O3.2 性能实测对比在LeetCode测试用例上的表现递归DFS平均92ms最大递归深度min(m,n)迭代DFS平均88ms空间占用更稳定BFS平均85ms适合广度较大的区域实际工程中选择建议对于规则网格BFS通常表现更好对于复杂拓扑结构DFS可能更合适4. 边界条件与特殊案例4.1 必须处理的异常情况空矩阵输入直接返回单行/单列矩阵所有元素都是边界全X矩阵无需任何处理全O矩阵全部变为X除非连接边界4.2 测试用例设计完整的测试应包含test_cases [ ([], []), # 空矩阵 ([[X]], [[X]]), # 1x1 ([[O,O],[O,O]], [[O,O],[O,O]]), # 全连接 ([[X,O,X],[X,O,X],[X,O,X]], [[X,O,X],[X,O,X],[X,O,X]]), # 边界连接 ([[X,X,X],[X,O,X],[X,X,X]], [[X,X,X],[X,X,X],[X,X,X]]) # 被包围 ]5. 算法扩展与变种5.1 并行化改造对于超大规模矩阵如1000x1000可以考虑将边界分区每个线程处理一段边界使用原子操作或锁保证标记正确性最终合并结果5.2 其他应用场景类似的连通区域分析算法还可用于图像处理中的前景提取棋盘类游戏的区域判定地图导航中的可达区域计算电路设计中的短路检测6. 工程实践建议预处理优化先检查四个角点如果都是X可以直接跳过对应行列的边界检查内存布局对于C实现按行优先存储矩阵可提升缓存命中率多语言实现Go语言的协程版本能获得更好的并发性能调试技巧在标记阶段打印中间矩阵状态可视化检查标记过程实际面试中面试官可能会追问如何证明你的算法是正确的如果矩阵太大内存放不下怎么办如何扩展到三维矩阵的情况这些问题的准备方向正确性证明数学归纳法边界条件覆盖大矩阵处理分块加载多趟扫描三维扩展6方向遍历空间分割树优化
说得直白些:如果这些结果经受住整个学界的检验,那么单是今天的这一轮发布,便堪称现代史上相关领域单日跨度最大的一次飞跃!Claude Fable 5更是直言:「按照菲尔茨奖标准,任何一项都足以获奖」!
OpenAI还有大…
📅 2026/8/3 11:47:19
1. 深度优先搜索(DFS)算法基础 深度优先搜索(Depth-First Search)是解决回溯类问题的经典算法策略。它采用"一条路走到黑"的探索方式,沿着某条路径尽可能深入地搜索,直到无法继续前进时才回溯到上…
📅 2026/8/3 11:47:19
1. 项目概述:学生心理压力咨询评判管理系统 这个系统本质上是一个面向高校心理咨询场景的数字化管理平台。我在开发过程中发现,传统心理咨询管理存在几个痛点:纸质档案易丢失、咨询师与学生匹配效率低、压力评估标准不统一。这套系统正是为了…
📅 2026/8/3 11:46:18
3分钟上手!VideoDownloadHelper:免费视频下载插件的完整使用指南 【免费下载链接】VideoDownloadHelper Chrome Extension to Help Download Video for Some Video Sites. 项目地址: https://gitcode.com/gh_mirrors/vi/VideoDownloadHelper
还在…
📅 2026/8/3 12:39:29
温馨提示:本人主页置顶文章(点我)开头有 CSDN 平台官方提供的学长联系方式的名片! 温馨提示:本人主页置顶文章(点我)开头有 CSDN 平台官方提供的学长联系方式的名片! 温馨提示:本人主页置顶文章(点我)开头有 CSDN 平台…
📅 2026/8/3 12:39:29
温馨提示:本人主页置顶文章(点我)开头有 CSDN 平台官方提供的学长联系方式的名片! 温馨提示:本人主页置顶文章(点我)开头有 CSDN 平台官方提供的学长联系方式的名片! 温馨提示:本人主页置顶文章(点我)开头有 CSDN 平台…
📅 2026/8/3 12:39:29
评估石英砖品牌实力,不看广告、不看榜单排名,看四个可验证的指标就够了——国标起草身份、CNAS检测体系、工程案例“浓度”、产品线覆盖度。工程采购优先看前三项,家用选砖重点看后两项。全国建陶企业几千家,能同时满足这四个指标…
📅 2026/8/3 12:39:29
户门K值怎么算?ISO标准这样说!
全文强制标准《建筑节能与可再生能源利用通用规范》GB 55015-2021将于2022年4月实施,对户门K值提出了明确要求。户门K值计算对产品设计和工程应用具有重要意义,来看看ISO标准怎么说吧!
1、标准要求
全文强制标准《建筑节能与可再生能源利…
📅 2026/8/3 12:39:29
5步精通Universal-Updater:从入门到精通的完整3DS自制软件管理指南 【免费下载链接】Universal-Updater An easy to use app for installing and updating 3DS homebrew 项目地址: https://gitcode.com/gh_mirrors/un/Universal-Updater
你是否曾经为了在Nin…
📅 2026/8/3 12:38:28
PC服务器具身机器人:构建具身智能从仿真到量产的闭环迭代混合架构一、前言:具身智能需要“混合算力闭环系统”传统人工智能依赖云端静态数据集训练,不具备物理交互能力,无法适应真实世界的不确定性。具身智能(Embodied…
📅 2026/8/3 0:00:19
前言构建机器人、具身智能这类分布式实时系统,通信底座直接决定整套系统的实时性、容错性、组网能力。分布式领域长期存在 4 类经典通信架构:点对点模式、Broker 中间代理模式、广播模式、以数据为中心(DDS)模式。很多开发者疑惑&…
📅 2026/8/3 0:00:19
完整指南:如何让2008-2017年老款Mac运行最新macOS系统 【免费下载链接】OpenCore-Legacy-Patcher Experience macOS just like before 项目地址: https://gitcode.com/GitHub_Trending/op/OpenCore-Legacy-Patcher
还在为手中的老款Mac无法升级到最新系统而烦…
📅 2026/8/3 0:00:19
1. 从水管网络到最大流:一个核心问题的诞生想象一下,你是一个城市供水系统的总工程师。你的城市有多个水源(水库),需要通过一个复杂的地下管道网络,将水输送到各个居民区。每条管道都有其最大通水能力&…
📅 2026/8/3 1:24:09
温馨提示:本人主页置顶文章(点我)开头有 CSDN 平台官方提供的学长联系方式的名片! 温馨提示:本人主页置顶文章(点我)开头有 CSDN 平台官方提供的学长联系方式的名片! 温馨提示:本人主页置顶文章(点我)开头有 CSDN 平台…
📅 2026/8/3 1:24:09
1. 从一次信号“找茬”说起:为什么我们需要互相关几年前,我在处理一组声学传感器数据时遇到了一个棘手的问题。我有两个麦克风记录了一段相同的音频信号,理论上它们接收到的声音波形应该非常相似,只是由于麦克风位置不同ÿ…
📅 2026/8/3 1:24:09
AgentCard 智能体卡片:为英语学习 App 打造桌面级学习助手适用平台:HarmonyOS 7.0 (API 26 Beta)一、引言
HarmonyOS 7.0(API 26 Beta)新增了 AgentCard 智能体卡片能力,这是继 HMAF(鸿蒙智能体框架&#x…
📅 2026/8/3 1:24:08
无损视频剪辑终极指南:如何实现快速高效的多媒体处理 【免费下载链接】lossless-cut The swiss army knife of lossless video/audio editing 项目地址: https://gitcode.com/gh_mirrors/lo/lossless-cut
在数字媒体创作领域,视频编辑处理的质量损…
📅 2026/8/3 1:24:08
1. 本科生论文写作的AI辅助现状本科毕业论文是每个大学生必须跨越的一道坎。记得我当年写论文时,光是文献检索就花了整整两周时间,打印的参考文献堆满了半个书桌。如今AI技术的发展为学术写作带来了革命性变化,合理使用这些工具可以节省80%以…
📅 2026/8/3 1:24:08