原地旋转矩阵需用四点轮换法:对左上象限每个未访问单元格(i,j),依次将值传至(j,n-1-i)→(n-1-i,n-1-j)→(n-1-j,i),再填回(i,j),仅用o(1)额外空间。

原地旋转的核心是四点轮换
矩阵顺时针旋转 90° 无法靠简单转置加翻转行来“假装原地”——那会额外占用 O(n) 行指针空间。真原地必须只用 O(1) 额外变量,靠坐标映射把每个元素挪到目标位置,且不覆盖未处理的值。matrix[i][j] 旋转后应落在 matrix[j][n-1-i],但直接赋值会丢数据,所以得用四元组轮换:对每个“未访问”的顶层左角单元格,把它的值依次传给右边、下边、左边的对应位置,最后把最开始的值填进左边位置。
关键约束:只遍历“左上角象限”,即行范围 0 到 n/2 - 1,列范围 i 到 n-1-i-1(避免重复和越界)。
- 对
n=4,只需处理(0,0)、(0,1)、(1,1)这 4 个起始点 - 每次轮换涉及 4 个坐标:
(i,j)→(j,n-1-i)→(n-1-i,n-1-j)→(n-1-j,i) - 务必用临时变量存
matrix[i][j],否则第一次赋值就丢失原始值
别把转置和翻转当成原地解法
写 transpose() 再对每行调用 reverse() 看似简洁,但它在 C++ 中对 vector<vector>></vector> 是假原地:每行 reverse() 虽然不分配新 vector,但 swap() 元素仍属就地操作;问题出在转置本身——它需要交换 matrix[i][j] 和 matrix[j][i],这要求 i
所以若看到错误提示 out_of_range 或结果错乱,先检查是否写了 for (int j = 0; j 而没限制 <code>j > i。
组合式C++代码评审方案,融合静态分析、AI推理、多轮迭代评审和C++专项检查,适用于PR审查、增量代码审查、全项目评审和代码质量评分,触发词包括review cpp、cpp代码评审、C++review、代码审查。
- 正确转置内层循环:
for (int j = i + 1; j - 后续翻转每行:
reverse(matrix[i].begin(), matrix[i].end()) - 该方法时间 O(n²),空间 O(1),但比四点轮换多一次遍历,且思维链更长
坐标变换公式必须手推,不能硬记
顺时针 90° 的通用映射是 (i, j) → (j, n−1−i),但这个式子容易和逆时针或镜像混淆。最稳的办法是拿 3×3 矩阵手动标四个角:
0,0 → 0,2 0,2 → 2,2 2,2 → 2,0 2,0 → 0,0
从中可反推出规律:新行号 = 原列号,新列号 = n−1−原行号。一旦写成 matrix[n-1-j][i] 就是逆时针了,运行后第一行变成最后一列倒序,明显不对。
- 验证技巧:取
i=0, j=0,代入看是否落到第 0 行末尾列 - 所有中间坐标必须显式检查边界:
j ?<code>n-1-i ? - 用
size_t做索引会导致n-1-i在 i=0 且 n=0 时溢出,务必确保 n > 0
LeetCode 测试用例常卡边界和类型
题库中输入通常是 vector<vector>></vector>,但函数签名可能是 void rotate(vector<vector>>& matrix)</vector>,意味着必须修改原容器。常见翻车点不是算法,而是 C++ 细节:
- 如果用了
auto n = matrix.size(),而 matrix 为空,n是size_t类型,n-1会绕成极大正数,循环直接奔溃 - 嵌套循环里混用
int i和size_t j,触发隐式转换警告甚至逻辑错误 - 忘记在轮换前判断
if (matrix.empty() || matrix[0].empty()) return;
实际提交前,至少跑一遍 n=0、n=1、n=2 三个用例。尤其是 n=2,只有 4 个元素,四点轮换刚好走一轮,最容易暴露坐标算错。
C++免费学习笔记(深入):立即使用
在学习笔记中,你将探索 C++ 的入门与实战技巧!










