必须原地旋转因题目要求空间复杂度o(1),新建数组或隐式分配内存均违规;核心是按层处理,每层取四分之一元素,通过四点轮换(三次交换)实现顺时针90°旋转。

为什么不能直接用新数组赋值
很多人第一反应是开个 new_matrix,按 new_matrix[j][n-1-i] = old_matrix[i][j] 填过去——这确实能转对,但题目要求“就地”,意味着空间复杂度必须是 O(1)。一旦申请新二维数组,哪怕只临时用一次,就违反了约束。更隐蔽的坑是:用 vector<vector>></vector> 的 resize 或 assign 也会隐式分配内存,得全程复用原容器的存储。
核心思路:四组坐标轮换
一个 N×N 矩阵顺时针转 90°,本质是把每层环上的元素按顺时针方向挪位。对任意位置 (i, j),它会依次流向:(i, j) → (j, n-1-i) → (n-1-i, n-1-j) → (n-1-j, i) → (i, j)
只要遍历最外层四分之一的元素(即上边行、不包含右端点),对每组四个位置做三次交换(第四个位置自然就位),就能完成整层旋转。
实操要点:
- 层数是
n/2(向下取整),用for (int layer = 0; layer - 每层的起始行/列都是
layer,结束位置是n - 1 - layer - 内层循环只跑
end - start次(即该层边长减一),避免重复处理 - 交换顺序建议:先存
tmp = matrix[i][j],再按顺时针反向赋值,不易错
示例关键片段:
int tmp = matrix[i][j]; matrix[i][j] = matrix[n-1-j][i]; matrix[n-1-j][i] = matrix[n-1-i][n-1-j]; matrix[n-1-i][n-1-j] = matrix[j][n-1-i]; matrix[j][n-1-i] = tmp;
边界情况和常见报错
容易在索引计算上翻车,尤其是 n 为奇数时中间点不用动,但循环范围写错会导致越界或漏转。典型错误现象:
-
std::out_of_range:内层循环上限写成,多跑一次 - 转出来是镜像或错位:坐标映射写反,比如把
(j, n-1-i)写成(n-1-j, i) - 只转了外层,内层不动:
layer循环条件用了,导致 <code>layer == n/2时i > j区域越界 - 用
size()但没注意vector是空的——务必先判if (matrix.empty() || matrix[0].empty()) return;
C++ 实现要注意的细节
如果输入是 vector<vector>></vector>,别忘了每行长度一致(题目保证 N×N,但代码健壮性要考虑);若用原始指针二维数组,要传 n 参数且确保内存连续。性能上,该算法时间 O(N²)、空间 O(1),无额外拷贝,cache 友好——因为每次访问的四个位置在内存中相对分散,但每层数据局部性尚可。真正容易被忽略的是:旋转操作不可逆,如果原图还要复用,得提前备份。
C++免费学习笔记(深入):立即使用
在学习笔记中,你将探索 C++ 的入门与实战技巧!











