“不使用额外空间”的旋转打印指不申请任何容器存储结果,仅用几个变量控制坐标并实时输出,空间复杂度o(1);原矩阵不可修改,需按层用top/bottom/left/right边界模拟螺旋遍历,每边单独判断避免重叠。

什么是“不使用额外空间”的旋转打印
这里的“不使用额外空间”指不申请 vector、array 或任何动态/静态容器来存结果序列,而是边计算坐标边输出(比如直接 cout),空间复杂度严格控制在 O(1)(仅用几个整型变量)。注意:原矩阵本身不算额外空间,但也不能修改它——否则就不是“打印”,而是“原地转置”了。
按层模拟 + 坐标映射是唯一可行路径
二维矩阵顺时针螺旋打印本质是“由外向内逐层遍历四条边”。每层用四个边界控制:top、bottom、left、right。关键在于:不存路径点,只算当前要访问的 (i, j),然后立刻输出。
- 从
left → right打印上边(固定i = top) - 从
top+1 → bottom打印右边(固定j = right) - 当
top 且 <code>left 时,才继续打印下边和左边,避免重复或越界 - 每轮结束后收缩边界:
top++、bottom--、left++、right--
示例(3×4 矩阵):
1 2 3 4 5 6 7 8 9 10 11 12
第一层输出顺序是:1 2 3 4 8 12 11 10 9 5,接着进入内层 6 7 —— 全程没用任何数组暂存。
逆时针旋转打印需要重排遍历顺序
逆时针螺旋(即左旋)不是简单把顺时针代码倒过来,而是起始边和方向全变:先左列(从下到上),再下行(从左到右),再右列(从上到下),再上行(从右到左)。边界收缩逻辑不变,但四段的条件和增量方向要一一核对。
- 错误高发点:
for (int i = bottom; i >= top; i--)忘加等号导致漏掉top行 - 更隐蔽的问题:当某层只剩单行或单列时,四段中会有两段重叠(比如只有 1 行,则“左列”和“右列”都试图扫同一列),必须用
if拆开判断,不能无脑写四段循环 - 推荐统一用
while (left 包裹,每段前加 <code>if校验维度有效性
为什么不能用数学公式直接算第 k 个位置
有人想推导通项公式:f(k) → (i, j),理论上可行,但实际极难维护。原因有三:
- 每层元素总数不规则(
2*(w+h)-4,且w、h随层递减),k 落在哪一层就得先二分或累加求和 - 同一层内四条边长度不同,还要判断 k 在哪一段,分支多、易错
- 调试困难:一个坐标算错,后续全崩,而层模拟法每步可打印中间边界值验证
真正省空间的务实做法,就是老老实实按层走——边界变量共 4 个 int,连 cache 友好性都比跳着随机访问强。
C++免费学习笔记(深入):立即使用
在学习笔记中,你将探索 C++ 的入门与实战技巧!











