1. 问题背景与核心挑战
LeetCode 130题"被围绕的区域"是一个经典的图论问题,考察对矩阵中连通区域的处理能力。题目要求我们将所有被'X'完全包围的'O'区域替换为'X',而边界上的'O'及其连通区域则保持不变。这个问题看似简单,但隐藏着几个关键陷阱:
- 边界条件处理:许多解法会忽略矩阵四边上的'O'及其连通区域
- 时间复杂度控制:直接对每个'O'进行DFS/BFS可能导致O(n^4)的最坏复杂度
- 原地修改要求:题目通常要求直接修改输入矩阵而非返回新矩阵
我在第一次尝试这个问题时,就因为没有正确处理边界条件而导致了错误答案。后来通过系统性地分析问题本质,总结出两种主流解法:BFS(广度优先搜索)和DFS(深度优先搜索)。下面我将详细解析这两种解法的实现细节与性能差异。
需要模型API调用? 免费领10W Token,多模型网关一键接入 Claude、DeepSeek 等主流模型。
2. BFS解法详解与优化
2.1 基础BFS实现思路
BFS解法采用队列数据结构,从边界上的'O'出发逐步标记所有相连的'O'。具体步骤:
- 遍历矩阵四边,将所有的'O'及其坐标加入队列
- 使用队列实现BFS,标记所有与边界'O'连通的'O'为特殊标记(如'T')
- 最后遍历整个矩阵:将剩余的'O'改为'X',将'T'恢复为'O'
python复制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))
board[r][c] = 'T'
for c in range(cols):
for r in [0, rows-1]:
if board[r][c] == 'O':
queue.append
