 的四大流派)
算法题经典解析螺旋矩阵 (Spiral Matrix) 的四大流派一、 题目梗概题目要求给定一个m x n的二维矩阵要求按照顺时针螺旋顺序返回矩阵中的所有元素。 核心难点这道题不涉及高深的数据结构纯粹考察代码边界控制能力和逻辑严密性。在面试中写出能跑通的代码不难难的是写出“优雅、无 Bug、一次 AC通过”的代码。二、 算法流派大赏将解法归纳为四大流派。完全重复的冗余逻辑已剔除以下为您展示最精华的实现思路及优缺点分析。⚔️ 流派一边界收缩派主流教科书解法运行最快 空间 O(1)思路解析设立top,bottom,left,right四堵虚拟墙。每走完一条边对应的墙就向内收缩一格。当墙壁互相交错时遍历结束。优缺点对比✅ 优点不需要额外空间原汁原味执行效率极高。❌ 缺点极易越界许多人在if判定中迷失导致死循环或重复读取。 黄金推荐代码C 究极优雅版将推墙操作up与碰撞检测完美融合代码极度精简。class Solution { public: vectorint spiralOrder(vectorvectorint matrix) { if(matrix.empty() || matrix[0].empty()) return {}; vectorint res; int up 0, down matrix.size() - 1; int left 0, right matrix[0].size() - 1; while (true) { // 向右走走完后上墙往下推 (up) for (int i left; i right; i) res.push_back(matrix[up][i]); if (up down) break; // 墙撞了直接下班 // 向下走走完后右墙往左推 (--right) for (int i up; i down; i) res.push_back(matrix[i][right]); if (--right left) break; // 向左走走完后下墙往上抬 (--down) for (int i right; i left; i--) res.push_back(matrix[down][i]); if (--down up) break; // 向上走走完后左墙往右推 (left) for (int i down; i up; i--) res.push_back(matrix[i][left]); if (left right) break; } return res; } }; 流派二标记探路派扫地机器人模拟法逻辑最顺 适合新手思路解析不关注墙在哪只控制一个“机器人”。沿着当前方向死磕如果前方“撞墙了”或“碰到了已走过的标记如 999, 233, INT_MAX”就右转 90 度继续走。总共走m * n步。优缺点对比✅ 优点逻辑一条线不需要烧脑去算四堵墙的交集通用性极强适用于一切走迷宫题。❌ 缺点修改了原矩阵放了路障如果用visited布尔数组则会额外消耗 O(m*n) 的内存空间。 黄金推荐代码Python 闭眼扫地版使用了d (d 1) % 4的方向盘黑魔法。class Solution: def spiralOrder(self, matrix: List[List[int]]) - List[int]: if not matrix: return [] m, n len(matrix), len(matrix[0]) ans [] # 方向盘右(0,1), 下(1,0), 左(0,-1), 上(-1,0) dx [0, 1, 0, -1] dy [1, 0, -1, 0] x, y, d 0, 0, 0 # 起点坐标 (0,0)初始方向 0(右) for _ in range(m * n): ans.append(matrix[x][y]) matrix[x][y] 999 # 放下路障代表已清扫 # 探路按当前方向看下一步 nx, ny x dx[d], y dy[d] # 如果越界或者撞到了路障猛打方向盘右转 if not (0 nx m and 0 ny n) or matrix[nx][ny] 999: d (d 1) % 4 # 核心魔法循环转向 nx, ny x dx[d], y dy[d] x, y nx, ny return ans 流派三魔法剥洋葱派Python 特供炫技代码最短 极度优雅思路解析像削洋葱一样把矩阵的第一行削掉存起来然后把剩下的矩阵逆时针旋转 90 度继续削第一行直到矩阵为空。优缺点对比✅ 优点Pythonic 审美的巅峰代码只有短短几行。❌ 缺点底层疯狂创建和解包新数组时间复杂度和空间复杂度都较高C 或 Java 实现极其痛苦。class Solution: def spiralOrder(self, matrix: List[List[int]]) - List[int]: res [] while matrix: # 1. 切下第一行并入答案 res matrix.pop(0) # 2. 神仙操作通过解包和翻转将矩阵逆时针转 90 度 # zip(*matrix) 按列解包[::-1] 倒序排列 if matrix: matrix list(zip(*matrix))[::-1] return res⚙️ 流派四硬核查表与计数派极客思维纯数学驱动思路解析这一类代码包括提交中的 C 语言switch-case版和 Java 的op二维状态机数组版完全摒弃了直观的图形想象。通过精密的数学偏移量和步数计数器如记录水平方向移动次数cx垂直cy来强行计算坐标。优缺点对比✅ 优点极致的逻辑压缩展现了强大的底层数学建模能力。❌ 缺点“离职代码”典范。可读性为零在真实面试中写出这种代码不仅容易写错还可能被面试官要求解释半个小时。由于排版篇幅与实用性考量此处不展示冗长的查表代码感兴趣的同学可尝试用状态机重写此题。三、 核心知识点随身记无论你选择哪种流派这道题中暴露出的几个编程语言特性都值得记入你的错题本前置自增/自减的妙用if (up down)。电脑会先将 up 加 1立刻返回新值进行判断极大地压缩了代码行数。取余转向法d (d 1) % 4。任何需要在上、下、左、右四个状态中循环切换的场景直接背诵此公式。二维矩阵的零点请时刻牢记电脑的坐标系零点(0,0)在左上角向右走是列递增y向下走是行递增x。