LeetCode 1091中等网格 BFS
二进制矩阵中的最短路径 图解题解
这道题到底在问什么
0 表示可走,1 表示障碍;从左上到右下,8 个方向移动,求最短路径长度。
- grid
- [[0,1],[1,0]]
- 输出
- 2
最优解:一步一步想明白
⚠️ 容易写错的地方
✗ 错:用 DFS 找最短路
✓ 对:无权最短路用 BFS
DFS 找到的第一条不保证最短
✗ 错:只按样例推代码
✓ 对:先写清状态含义和边界条件
样例太少,隐藏用例专打边界
✗ 错:变量名和动画不一致
✓ 对:代码变量沿用动画里的核心名字
学习时最怕脑内维护两套概念
完整代码(Python)
Python
from collections import deque
class Solution:
def shortestPathBinaryMatrix(self, grid):
n = len(grid)
if grid[0][0] or grid[n-1][n-1]:
return -1
q = deque([(0, 0, 1)])
grid[0][0] = 1
dirs = [(a,b) for a in (-1,0,1) for b in (-1,0,1) if a or b]
while q:
r, c, d = q.popleft()
if r == n - 1 and c == n - 1:
return d
for dr, dc in dirs:
nr, nc = r + dr, c + dc
if 0 <= nr < n and 0 <= nc < n and grid[nr][nc] == 0:
grid[nr][nc] = 1
q.append((nr, nc, d + 1))
return -1套路模板 · 网格 BFS
# 网格 BFS 通用检查表
# 1. 定义状态/指针/容器
# 2. 每轮只做一个清晰动作
# 3. 更新答案并处理边界复杂度
时间复杂度
O(n²)
每个核心状态按算法要求处理固定次数
空间复杂度
O(n²)
只保存必要的辅助结构或递归栈
看不够?换成动画再走一遍
上面的推演每一步都对应一帧动画。点开交互动画版,能一步步看着 二进制矩阵中的最短路径 的数据怎么变、指针怎么走,还能切 Python / Java / C++ 跟着练。
面试官可能追问
这道题为什么用「BFS」,换最直接的暴力解会差在哪?+
BFS抓住了本题的结构特征,把暴力解里重复的工作省掉;暴力解通常要多嵌套一层枚举,数据一大就超时。具体对比见上文「暴力解及其卡点」与「最优解逐步推演」两节。
时间复杂度为什么是 undefined?怎么推出来的?+
按上文复杂度小节的推导,时间复杂度为 undefined。
本平台为独立第三方培训机构,与华为技术有限公司无任何关联;课程的服务内容与权益以购买协议为准,学习效果因个人情况而异。「华为 OD」「华为可信」等仅为对岗位与考试方向的客观描述,相关商标归各自权利人所有。