1. 问题背景与核心挑战
LeetCode 130题"被围绕的区域"是一个经典的图遍历问题,通常出现在技术面试的中高难度环节。题目要求我们将二维矩阵中所有被'X'完全包围的'O'区域替换为'X',而保留那些与边界相连的'O'区域。这个看似简单的问题实际上考察了开发者对图遍历算法的深入理解和灵活应用能力。
我第一次遇到这个问题时,直觉反应是应该从矩阵内部的'O'出发,检查它们是否被'X'包围。但实际操作中发现这种思路存在明显缺陷——判断一个区域是否被完全包围的计算成本极高。后来通过反复尝试,才意识到应该采用逆向思维:从边界上的'O'出发,标记所有与之相连的区域,这些就是需要保留的部分,其余内部的'O'则可以安全地替换为'X'。
需要模型API调用? 免费领10W Token,多模型网关一键接入 Claude、DeepSeek 等主流模型。
2. 解法一:广度优先搜索(BFS)实现详解
2.1 BFS算法原理与适用性分析
广度优先搜索采用队列数据结构,按照"近水楼台先得月"的原则层层扩展。对于矩阵问题,BFS特别适合寻找最短路径或连通区域,因为它能保证在发现目标时已经遍历了最小范围的节点。在本问题中,我们需要快速找到所有与边界相连的'O'区域,这正是BFS的拿手好戏。
提示:BFS的空间复杂度通常高于DFS,因为需要维护队列。但在最坏情况下(如整个矩阵都是'O'),两者的空间复杂度都是O(M×N)。
2.2 完整BFS实现代码与逐行解析
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] = 'B' # 标记为待保留
for c in range(cols):
for
