螺旋遍历的边界收缩逻辑是维护top、right、bottom、left四个边界变量,按“上→右→下→左”顺序逐层遍历,每完成一个方向即收缩对应边界(如top++、right--等),并在每次遍历前检查边界有效性,防止越界或重复访问。

什么是螺旋遍历的边界收缩逻辑
螺旋遍历本质是按「上→右→下→左」顺序逐层剥洋葱,每走完一个方向就收缩对应边界。关键不是记方向,而是维护四个变量:top、right、bottom、left,每次遍历一行或一列后立即更新——比如从左到右走完第 top 行后,top++;从上到下走完第 right 列后,right--。
容易踩的坑:
- 边界更新不及时,导致某行/列被重复访问或跳过
- 没有在每次方向遍历前检查边界是否仍有效(例如 top 才能横向遍历)
如何用 while 循环控制四边收缩
用 while (top 作为外层条件,比用 for + 方向计数更直观可靠。每次循环内按固定顺序处理四条边,但每条边都要前置判断:
- 从左到右:仅当
top 时遍历 <code>matrix[top][left...right],然后top++ - 从上到下:仅当
left 时遍历 <code>matrix[top...bottom][right],然后right-- - 从右到左:仅当
top 时遍历 <code>matrix[bottom][right...left],然后bottom-- - 从下到上:仅当
left 时遍历 <code>matrix[bottom...top][left],然后left++
注意:后两个方向的边界条件容易漏掉,尤其空矩阵或单行/单列时,缺判断会越界或重复。
vector> 的索引陷阱
C++ 中 vector<vector>></vector> 不是二维数组,matrix[i].size() 是第 i 行长度,不能直接用 matrix.size() 当列数。初始化边界时必须写:
组合式C++代码评审方案,融合静态分析、AI推理、多轮迭代评审和C++专项检查,适用于PR审查、增量代码审查、全项目评审和代码质量评分,触发词包括review cpp、cpp代码评审、C++review、代码审查。
立即学习“C++免费学习笔记(深入)”;
int top = 0, bottom = matrix.size() - 1; int left = 0, right = matrix.empty() ? -1 : matrix[0].size() - 1;
否则空输入或不规则矩阵(虽然题目通常保证矩形)会崩。另外,C++ 没有负索引保护,right 初始化错成 matrix[0].size() 会导致第一次 right-- 后变成 -1,后续访问 matrix[i][-1] 是未定义行为。
为什么不用递归或方向向量
递归实现易栈溢出且边界传递繁琐;方向向量(如 dx[4] = {0,1,0,-1})看似简洁,但实际要额外维护当前方向、判断转向时机、处理边界收缩与转向的耦合——反而增加出错概率。螺旋遍历的结构天然适合显式边界管理,四次 if + 四次更新,逻辑直来直去,调试时打个断点就能看清哪条边没走或哪次收缩错了。
真正复杂的是边界条件组合:比如 1×n 矩阵会在第一次「右移」后 top > bottom,后面三步必须全跳过;而 n×1 矩阵则在「下移」后 left > right。这些靠方向向量很难一眼看出,但用显式 if (top 就一目了然。

















