尧图精选

[Python]矩阵三题通关笔记:螺旋、旋转、迷宫(附避坑指南)

🕒 发布时间:2026/9/1 6:33:03 📁 来源:尧图网络
项目地址Python_test_3前言今天集中攻克了三道矩阵类高频题分别是螺旋矩阵按层模拟方向控制矩阵旋转原地旋转两步法迷宫寻路DFS 回溯 / 迭代栈 parent 字典其中迷宫寻路最考验细节下面逐一总结。一、螺旋矩阵按层模拟核心思路用四个变量top, bottom, left, right表示当前层的边界每次按顺时针方向遍历四条边然后收缩边界。标准模板def spiral_order(matrix): if not matrix or not matrix[0]: return [] m, n len(matrix), len(matrix[0]) top, bottom, left, right 0, m-1, 0, n-1 res [] while top bottom and left right: # 上边从左到右 for j in range(left, right1): res.append(matrix[top][j]) top 1 # 右边从上到下 for i in range(top, bottom1): res.append(matrix[i][right]) right - 1 # 下边从右到左需要检查 top bottom if top bottom: for j in range(right, left-1, -1): res.append(matrix[bottom][j]) bottom - 1 # 左边从下到上需要检查 left right if left right: for i in range(bottom, top-1, -1): res.append(matrix[i][left]) left 1 return res易错点单行或单列遍历下边和左边前必须加if判断否则会重复遍历。边界更新顺序每遍历完一边立即更新边界保证下一次遍历的范围正确。二、矩阵旋转原地旋转核心思路两步法先上下翻转再沿主对角线对称交换。标准模板n×n 方阵def rotate(matrix): n len(matrix) # 1. 上下翻转 for i in range(n // 2): matrix[i], matrix[n-1-i] matrix[n-1-i], matrix[i] # 2. 主对角线对称交换只遍历上三角 for i in range(n): for j in range(i1, n): matrix[i][j], matrix[j][i] matrix[j][i], matrix[i][j]易错点对角线交换范围必须是j i上三角不能遍历下三角否则会重复交换导致还原。上下翻转的循环次数n // 2奇数时中间一行不动。原地操作不需要额外矩阵但需要临时变量Python 元组交换自动处理。变体逆时针旋转先左右翻转再主对角线对称或先上下翻转再副对角线对称。三、迷宫寻路DFS parent 字典题目描述给定 m×n 网格0 可通行1 障碍从 (0,0) 到 (m-1,n-1)只能向右或向下返回任意一条路径。迭代 DFS 标准模板def find_path(grid): if not grid or not grid[0]: return [] m, n len(grid), len(grid[0]) # 起点或终点是障碍直接返回 if grid[0][0] 1 or grid[m-1][n-1] 1: return [] stack [(0, 0)] parent {(0, 0): None} # 记录每个格子的前驱 found False while stack: x, y stack.pop() if x m-1 and y n-1: found True break # 只向右和向下 for dx, dy in [(0, 1), (1, 0)]: nx, ny x dx, y dy # 注意检查新格子是否可通行不是当前格子 if 0 nx m and 0 ny n and grid[nx][ny] 0 and (nx, ny) not in parent: parent[(nx, ny)] (x, y) stack.append((nx, ny)) if not found: return [] # 回溯路径 path [] cur (m-1, n-1) while cur is not None: path.append(cur) cur parent[cur] path.reverse() return path⚠️ 细节陷阱最容易摸错的地方陷阱1起点/终点的障碍检查# ❌ 错误用 and if grid[0][0] 1 and grid[m-1][n-1] 1: return [] # ✅ 正确用 or只要有一个是障碍就返回 if grid[0][0] 1 or grid[m-1][n-1] 1: return []原因起点或终点任一为障碍都不可能到达必须提前返回。陷阱2邻居合法性检查中的grid判断# ❌ 错误检查当前格子 if ... and grid[x][y] 0 and ... # ✅ 正确检查新格子 if ... and grid[nx][ny] 0 and ...原因当前格子(x,y)既然在栈中说明它一定是可通行的已通过前面的检查。我们需要判断的是下一步要去的格子是否可通行。陷阱3parent字典的初始化# 正确写法 parent {(0, 0): None}原因起点没有前驱设为None。回溯时作为终止条件。如果漏掉初始化回溯到起点时会报 KeyError。陷阱4not in parent的作用if ... and (nx, ny) not in parent:作用防止重复访问同一个格子。因为只能向右向下理论上不会走回头路但为了避免环形路径或重复入栈加上这个判断更安全。同时它也起到了visited的作用。陷阱5路径回溯的方向# 从终点开始 cur (m-1, n-1) while cur is not None: path.append(cur) cur parent[cur] # 跳到前一个格子 path.reverse() # 反转得到正确顺序注意parent记录的是“从哪来”所以回溯时是从终点倒着走到起点最后必须反转。陷阱6栈的弹出顺序影响路径使用stack.pop()后进先出是 DFS找到的路径不一定最短。如果要求最短路径应使用 BFS队列collections.deque。四、总结题目核心技巧易错点螺旋矩阵四边界变量 方向循环单行/单列时的边界判断矩阵旋转上下翻转 对角线交换对角线遍历范围上三角迷宫寻路迭代 DFS parent 字典起点/终点检查、新格子判断、parent 初始化、回溯反转矩阵类题型的关键在于边界条件的全覆盖和细节的严谨性。建议每道题至少手写三遍直到闭眼能写出无 bug 的代码。五、练习建议螺旋矩阵 II按螺旋顺序填充矩阵—— 巩固方向控制。岛屿数量DFS/BFS 连通分量—— 巩固 DFS 遍历。单词搜索矩阵中找单词回溯—— 巩固回溯 visited 管理。祝你考试顺利拿下 200 分
上一篇/下一篇内容由系统自动关联 返回资讯列表 →