原地顺时针旋转90°需先转置再水平翻转,仅适用于n×n方阵;非方阵必须用额外空间映射到新数组,按resj = matrixi填充;std::rotate不适用二维旋转,边界须校验matrix非空且行列相等。

原地旋转需要先转置再翻转
直接逐元素计算新坐标容易出错,尤其边界处理;更可靠的做法是分两步:先沿主对角线转置矩阵,再对每行做水平翻转。这样所有操作都在原数组内完成,空间复杂度 O(1),且逻辑清晰、不易越界。
注意:该方法仅适用于 n x n 方阵。非方阵无法原地 90° 旋转(行列数互换后尺寸变化,必须分配新内存)。
- 转置:交换
matrix[i][j]和matrix[j][i],只遍历上三角(j > i),避免重复交换 - 翻转:对每一行
i,交换matrix[i][j]和matrix[i][n-1-j],j从0到n/2 - 1 - 顺序不能颠倒:先翻转再转置得到的是逆时针 90°,不是题目要求的顺时针
使用额外空间更直观但需注意索引映射
申请一个新二维数组 res,尺寸为 n x n,然后按规律填值:原数组第 i 行第 j 列,旋转后落在新数组第 j 行、第 n-1-i 列。这是顺时针 90° 的标准映射关系。
常见错误是把 n-1-i 写成 i 或 n-i,导致最后一行错位或越界。
- 正确映射:
res[j][n - 1 - i] = matrix[i][j] - 循环顺序:外层
i(行),内层j(列),保证原数组遍历完整 - 若用
vector<vector>></vector>,记得初始化res大小:vector<vector>> res(n, vector<int>(n))</int></vector>
std::rotate 不适用二维数组直接旋转
std::rotate 是为一维序列设计的,它按迭代器移动元素,无法理解二维布局。强行把二维数组首地址转成 int* 并传给 std::rotate,只会按内存顺序轮转整块数据,结果完全不可控——不是几何意义上的旋转,而是字节层面的错乱移位。
组合式C++代码评审方案,融合静态分析、AI推理、多轮迭代评审和C++专项检查,适用于PR审查、增量代码审查、全项目评审和代码质量评分,触发词包括review cpp、cpp代码评审、C++review、代码审查。
有人尝试用 std::rotate 配合多次行/列操作,但代码冗长、可读性差,且易因步长计算错误引入 undefined behavior。
- 不要试图用
std::rotate替代转置+翻转 - 如果真想用 STL 算法,可对每行单独调用
std::reverse(用于第二步翻转),但转置仍需手写双循环 - 对
vector存储的二维数组,std::rotate作用于某一行是合法的,但和“旋转整个矩阵”无关
LeetCode 48 题的边界检查要点
实际刷题(如 LeetCode 48)时,输入可能为空或单行/单列。不加判断直接访问 matrix[0].size() 会崩溃。
必须前置校验:if (matrix.empty() || matrix[0].empty()) return;。另外,matrix.size() 和 matrix[0].size() 必须相等才可执行原地旋转,否则应报错或拒绝处理。
- 空矩阵:直接返回
- 单元素:无需操作
- 单行(
1 x n):顺时针 90° 后变为n x 1列向量,必须用额外空间,原地方法不适用 - 编译期已知尺寸(如
int a[4][4])可用模板推导n,但运行时数组(vector)必须动态获取
原地旋转的两步法看似多一次遍历,但避免了索引公式记忆负担;而映射法虽直观,一旦行列下标写反,调试时很难一眼看出问题。真正容易被忽略的是:非方阵场景下,连“旋转90度”这个操作本身的定义都需要先明确输出格式——是截断?补零?还是报错?
C++免费学习笔记(深入):立即使用
在学习笔记中,你将探索 C++ 的入门与实战技巧!










