力扣130题:被围绕的区域DFS/BFS解法与优化
1. 问题背景与核心挑战今天咱们来啃一块硬骨头——力扣第130题被围绕的区域。这道题在面试中的出现频率相当高尤其喜欢考那些自诩精通DFS/BFS的候选人。题目看似简单给定一个二维矩阵把所有被X完全包围的O区域替换为X。但实际操作中90%的候选人都会掉进同一个坑里。我第一次遇到这个问题是在某大厂终面当时自信满满地写了个标准DFS结果面试官微微一笑如果棋盘是1000×1000呢瞬间栈溢出。这道题的精妙之处在于它考察的不仅是基础算法能力更是对问题本质的理解和优化思维。2. 暴力DFS解法与致命缺陷2.1 最直观的暴力思路大多数人包括当年的我的第一反应是这样的遍历整个矩阵遇到O就启动DFS/BFS检查这个区域是否被X完全包围如果是就全部翻转为X用Python实现的伪代码大概长这样def solve(board): if not board: return m, n len(board), len(board[0]) def dfs(i, j): if 0 i m and 0 j n and board[i][j] O: board[i][j] # dfs(i1, j) dfs(i-1, j) dfs(i, j1) dfs(i, j-1) for i in range(m): for j in range(n): if board[i][j] O: # 临时标记为#以便后续处理 dfs(i, j) # 检查是否被包围需要额外实现check_surrounded函数 if check_surrounded(board, i, j): flip_region(board, #, X) else: flip_region(board, #, O)2.2 这个解法为什么不行这个解法有三个致命问题栈溢出风险当矩阵很大时比如1000×1000全是O递归深度会达到百万级直接爆栈重复计算同一个O可能被多个相邻O重复访问逻辑漏洞边缘的O区域永远不会被包围但上述代码仍会尝试处理关键教训在矩阵类问题中递归实现的DFS往往不是最优解特别是在面对大规模数据时。面试官设置这样的边界条件就是为了考察候选人是否考虑到了算法在实际工程中的应用场景。3. 逆向思维从边缘突围3.1 解题思路的重构经过前面的失败我们需要换个角度思考与其费力寻找被包围的区域不如直接找出没有被包围的区域——也就是所有与边缘相连的O区域。剩下的O自然就是被包围的。具体步骤先处理四条边上的O用DFS/BFS标记所有与之相连的O这些被标记的O就是存活区域不应该被翻转最后遍历整个矩阵未被标记的O→翻转为X被标记的O→恢复为O3.2 优化后的代码实现def solve(board): if not board: return m, n len(board), len(board[0]) def dfs(i, j): if 0 i m and 0 j n and board[i][j] O: board[i][j] S # S表示Survive dfs(i1, j) dfs(i-1, j) dfs(i, j1) dfs(i, j-1) # 处理第一列和最后一列 for i in range(m): if board[i][0] O: dfs(i, 0) if board[i][n-1] O: dfs(i, n-1) # 处理第一行和最后一行 for j in range(n): if board[0][j] O: dfs(0, j) if board[m-1][j] O: dfs(m-1, j) # 最终处理 for i in range(m): for j in range(n): if board[i][j] O: board[i][j] X elif board[i][j] S: board[i][j] O4. 工程优化用迭代代替递归4.1 避免栈溢出的BFS实现虽然上面的解法已经不错但在极端情况下仍可能栈溢出。更工程化的做法是用显式栈DFS或队列BFS代替递归。以下是BFS实现from collections import deque def solve(board): if not board: return m, n len(board), len(board[0]) queue deque() # 将边缘的O加入队列 for i in range(m): if board[i][0] O: queue.append((i, 0)) if board[i][n-1] O: queue.append((i, n-1)) for j in range(n): if board[0][j] O: queue.append((0, j)) if board[m-1][j] O: queue.append((m-1, j)) # BFS标记所有连通区域 while queue: i, j queue.popleft() if 0 i m and 0 j n and board[i][j] O: board[i][j] S queue.append((i1, j)) queue.append((i-1, j)) queue.append((i, j1)) queue.append((i, j-1)) # 最终处理 for i in range(m): for j in range(n): if board[i][j] O: board[i][j] X elif board[i][j] S: board[i][j] O4.2 复杂度分析时间复杂度O(M×N)每个节点最多被访问两次标记和最终处理空间复杂度O(M×N)最坏情况下需要存储所有边缘节点5. 面试中的进阶考察点5.1 如何应对面试官的追问在实际面试中面试官可能会提出以下进阶问题如果矩阵太大无法放入内存怎么办答可以分块处理但需要额外记录边缘信息如何并行化这个算法答可以按行/列分片但需要处理边界处的O区域合并如果O和X的含义反转找被O包围的X会怎样答算法逻辑完全对称只需调整标记条件5.2 实际工程中的应用变种这类区域填充算法在实际工程中有很多应用场景图像处理中的连通区域分析地图服务中的封闭区域检测游戏开发中的地形生成电路设计中的短路检测6. 代码模板与记忆技巧6.1 通用DFS/BFS模板对于矩阵类的DFS/BFS问题可以记住这个通用模板def matrix_dfs_bfs(matrix): if not matrix: return m, n len(matrix), len(matrix[0]) directions [(1,0), (-1,0), (0,1), (0,-1)] # 四连通方向 # DFS递归实现 def dfs(i, j): # 边界检查 if not (0 i m and 0 j n): return # 业务逻辑判断 if matrix[i][j] ! target_condition: return # 处理当前节点 process_current(matrix, i, j) # 递归邻居 for di, dj in directions: dfs(idi, jdj) # BFS队列实现 from collections import deque queue deque(initial_nodes) while queue: i, j queue.popleft() # 边界检查 if not (0 i m and 0 j n): continue # 业务逻辑判断 if matrix[i][j] ! target_condition: continue # 处理当前节点 process_current(matrix, i, j) # 加入邻居 for di, dj in directions: queue.append((idi, jdj))6.2 解题思路记忆口诀对于这类区域填充问题可以记住这个口诀 边缘入手标记活中间剩余全消灭解释先从边缘找到所有存活点与边缘连通的O标记这些存活点如改为S最后遍历整个矩阵未被标记的O→消灭改为X被标记的S→恢复改回O7. 同类问题举一反三掌握这个思路后可以轻松解决以下类似问题力扣200. 岛屿数量力扣695. 岛屿的最大面积力扣463. 岛屿的周长力扣529. 扫雷游戏力扣994. 腐烂的橘子这些问题的共同特点是都需要在矩阵中找到符合条件的连通区域只是处理逻辑稍有不同。建议按这个顺序练习逐步掌握变种问题的解法。

相关新闻

华硕笔记本终极性能优化指南:G-Helper完整配置教程

华硕笔记本终极性能优化指南:G-Helper完整配置教程

华硕笔记本终极性能优化指南:G-Helper完整配置教程 【免费下载链接】g-helper Lightweight Armoury Crate alternative for Asus laptops with nearly the same functionality. Works with ROG Zephyrus, Flow, TUF, Strix, Scar, ProArt, Vivobook, Zenbook, Exper…

2026/8/9 6:30:56 阅读更多 →
小米智能摄像机4 Max AI变焦版:家用安防如何实现清晰远距离监控

小米智能摄像机4 Max AI变焦版:家用安防如何实现清晰远距离监控

1. 先搞清楚 739 元能买到什么样的 AI 变焦摄像机如果你正在看家用智能摄像机,特别是想找一个能看清远处细节的,那小米新出的这个“4 Max AI 变焦版”就值得关注。它最核心的能力,不是简单的“能放大”,而是通过 AI 算法和物理变焦…

2026/8/9 6:30:56 阅读更多 →
边端AI技术解析:从模型轻量化到工业质检实战部署

边端AI技术解析:从模型轻量化到工业质检实战部署

1. 项目概述:当AI从云端“下放”到边缘最近和几个做物联网和嵌入式开发的老朋友聊天,话题总绕不开“边端AI”。大家普遍的感觉是,这玩意儿火得有点不讲道理,但仔细一想,又觉得理所当然。表面上看,大家讨论的…

2026/8/9 6:29:55 阅读更多 →

最新新闻

为什么选择go-runewidth?深入解析这款高效Golang字符宽度计算库

为什么选择go-runewidth?深入解析这款高效Golang字符宽度计算库

为什么选择go-runewidth?深入解析这款高效Golang字符宽度计算库 【免费下载链接】go-runewidth wcwidth for golang 项目地址: https://gitcode.com/gh_mirrors/go/go-runewidth 在开发命令行工具、终端应用或需要精确文本排版的Golang项目时,字符…

2026/8/9 19:35:59 阅读更多 →
AI四巨头联手创立Discovery Loop:下一代AI发现循环系统技术解析

AI四巨头联手创立Discovery Loop:下一代AI发现循环系统技术解析

最近,AI 领域又传来一个重磅消息:Jeff Dean、Demis Hassabis、Yann LeCun 和 Yoshua Bengio 这四位被业界称为“AI 四巨头”的传奇人物,联手创立了一家名为 Discovery Loop 的新公司。消息一出,整个科技圈都炸了锅。这四位中的任何…

2026/8/9 19:35:59 阅读更多 →
cpp-tbox高级特性:定时器池、事件扩展与异步操作模式

cpp-tbox高级特性:定时器池、事件扩展与异步操作模式

cpp-tbox高级特性:定时器池、事件扩展与异步操作模式 【免费下载链接】cpp-tbox A complete Linux application software development tool library and runtime framework, aim at make C development easy. 项目地址: https://gitcode.com/gh_mirrors/cp/cpp-tb…

2026/8/9 19:35:59 阅读更多 →
10分钟上手Charlatano:初学者必备的CS:GO辅助工具设置教程

10分钟上手Charlatano:初学者必备的CS:GO辅助工具设置教程

10分钟上手Charlatano:初学者必备的CS:GO辅助工具设置教程 【免费下载链接】Charlatano Proves JVM cheats are viable on native games, and demonstrates the longevity against anti-cheat signature detection systems 项目地址: https://gitcode.com/gh_mirr…

2026/8/9 19:35:59 阅读更多 →
Excel行列函数ROW与COLUMN的高效应用指南

Excel行列函数ROW与COLUMN的高效应用指南

1. Excel行号列号函数ROW与COLUMN基础解析在Excel数据处理中,ROW和COLUMN函数是最基础却常被低估的定位工具。这两个函数看似简单,却能构建复杂数据处理模型的骨架。我们先从函数的基本语法开始:ROW([reference])返回指定单元格的行号COLUMN(…

2026/8/9 19:35:59 阅读更多 →
终极优化:Qwen3-VL-8B-Instruct-w8a8-llmcompressor-v0.12.0的OpenMP配置与ZenDNN加速技巧

终极优化:Qwen3-VL-8B-Instruct-w8a8-llmcompressor-v0.12.0的OpenMP配置与ZenDNN加速技巧

终极优化:Qwen3-VL-8B-Instruct-w8a8-llmcompressor-v0.12.0的OpenMP配置与ZenDNN加速技巧 【免费下载链接】Qwen3-VL-8B-Instruct-w8a8-llmcompressor-v0.12.0 项目地址: https://ai.gitcode.com/hf_mirrors/amd/Qwen3-VL-8B-Instruct-w8a8-llmcompressor-v0.12…

2026/8/9 19:34:59 阅读更多 →

日新闻

5分钟告别提取码焦虑:baidupankey如何智能破解百度网盘资源锁

5分钟告别提取码焦虑:baidupankey如何智能破解百度网盘资源锁

5分钟告别提取码焦虑:baidupankey如何智能破解百度网盘资源锁 【免费下载链接】baidupankey 在线查询网盘提取码(维护中 rm repo) 项目地址: https://gitcode.com/gh_mirrors/ba/baidupankey 你是否曾经在深夜寻找一份重要资料&#x…

2026/8/9 0:01:47 阅读更多 →
如何快速生成中国车牌图片:Python开源工具完整指南

如何快速生成中国车牌图片:Python开源工具完整指南

如何快速生成中国车牌图片:Python开源工具完整指南 【免费下载链接】chinese_license_plate_generator 中国车牌生成器 项目地址: https://gitcode.com/gh_mirrors/ch/chinese_license_plate_generator 中国车牌生成器是一个基于Python的开源项目&#xff0c…

2026/8/9 0:01:47 阅读更多 →
收藏!小白程序员轻松入门大模型,从Harness工程开始实践

收藏!小白程序员轻松入门大模型,从Harness工程开始实践

文章强调学习大模型不应只关注模型本身,而应重视模型外的系统搭建,即Harness。提出AgentModelHarness的实用公式,详细介绍Harness的四个层次:持久化层、执行层、控制层和观察与验证层。文章还探讨了上下文工程、工具设计、AGENTS.…

2026/8/9 0:03:48 阅读更多 →

周新闻

5分钟告别提取码焦虑:baidupankey如何智能破解百度网盘资源锁

5分钟告别提取码焦虑:baidupankey如何智能破解百度网盘资源锁

5分钟告别提取码焦虑:baidupankey如何智能破解百度网盘资源锁 【免费下载链接】baidupankey 在线查询网盘提取码(维护中 rm repo) 项目地址: https://gitcode.com/gh_mirrors/ba/baidupankey 你是否曾经在深夜寻找一份重要资料&#x…

2026/8/9 0:01:47 阅读更多 →
如何快速生成中国车牌图片:Python开源工具完整指南

如何快速生成中国车牌图片:Python开源工具完整指南

如何快速生成中国车牌图片:Python开源工具完整指南 【免费下载链接】chinese_license_plate_generator 中国车牌生成器 项目地址: https://gitcode.com/gh_mirrors/ch/chinese_license_plate_generator 中国车牌生成器是一个基于Python的开源项目&#xff0c…

2026/8/9 0:01:47 阅读更多 →
收藏!小白程序员轻松入门大模型,从Harness工程开始实践

收藏!小白程序员轻松入门大模型,从Harness工程开始实践

文章强调学习大模型不应只关注模型本身,而应重视模型外的系统搭建,即Harness。提出AgentModelHarness的实用公式,详细介绍Harness的四个层次:持久化层、执行层、控制层和观察与验证层。文章还探讨了上下文工程、工具设计、AGENTS.…

2026/8/9 0:03:48 阅读更多 →

月新闻

免费解锁百度网盘SVIP加速:macOS用户必备的下载提速终极指南

免费解锁百度网盘SVIP加速:macOS用户必备的下载提速终极指南

免费解锁百度网盘SVIP加速:macOS用户必备的下载提速终极指南 【免费下载链接】BaiduNetdiskPlugin-macOS For macOS.百度网盘 破解SVIP、下载速度限制~ 项目地址: https://gitcode.com/gh_mirrors/ba/BaiduNetdiskPlugin-macOS 还在为百度网盘macOS版的龟速下…

2026/8/9 17:05:02 阅读更多 →
终极ncmdump指南:3分钟实现网易云NCM音乐解密与格式转换

终极ncmdump指南:3分钟实现网易云NCM音乐解密与格式转换

终极ncmdump指南:3分钟实现网易云NCM音乐解密与格式转换 【免费下载链接】ncmdump 项目地址: https://gitcode.com/gh_mirrors/ncmd/ncmdump 还在为网易云音乐下载的NCM格式文件无法在其他播放器播放而烦恼吗?ncmdump解密工具帮你轻松解决这个困…

2026/8/9 0:45:04 阅读更多 →
HarmonyOS 应用开发《掌上英语》第81篇: 智能体卡片:为英语学习 App 打造桌面级学习助手

HarmonyOS 应用开发《掌上英语》第81篇: 智能体卡片:为英语学习 App 打造桌面级学习助手

AgentCard 智能体卡片:为英语学习 App 打造桌面级学习助手适用平台:HarmonyOS 7.0 (API 26 Beta)一、引言 HarmonyOS 7.0(API 26 Beta)新增了 AgentCard 智能体卡片能力,这是继 HMAF(鸿蒙智能体框架&#x…

2026/8/9 17:05:02 阅读更多 →