原地旋转矩阵需先转置再每行翻转,仅适用于方阵;非方阵须用新数组,顺时针90°后尺寸变为n×m,旧坐标(i,j)映射至(j,m−1−i)。

原地旋转需要先转置再翻转
直接按坐标映射写循环容易出错,尤其边界条件。最稳的思路是分两步:transpose(行列互换)+ reverse 每行。前提是方阵(n x n),否则无法原地操作。
常见错误现象:index out of bounds、旋转后数据错位、只动了上三角。
- 转置时只需遍历上三角:内层循环从
j = i + 1开始,避免重复交换 - 翻转每行用
std::reverse(row.begin(), row.end())或双指针,别手写错索引 - 如果数组是
int arr[N][N]这种 C 风格静态数组,不能直接用std::vector方法,得手动算地址或封装成类
非方阵必须用新数组,注意行列尺寸互换
比如 m x n 矩阵顺时针转 90° 后变成 n x m,旧坐标 (i, j) 映射到新坐标 (j, m - 1 - i)。这个公式别记混——逆时针是 (n - 1 - j, i),容易搞反。
使用场景:图像处理、游戏地图、矩阵输入输出题。
- 新数组第一维大小是原列数
n,第二维是原行数m - 循环顺序建议外层
i(原行),内层j(原列),对应填充新数组new_arr[j][m - 1 - i] - 若用
std::vector<:vector>></:vector>,记得初始化new_arr(n, std::vector<int>(m))</int>,否则访问会崩溃
std::vector 嵌套时别用 resize 错误预分配
有人写 res.resize(n); for (auto& r : res) r.resize(m); 却在循环里填错位置,结果全为 0。根本原因是没对齐映射关系。
性能影响:非原地旋转必然有 O(mn) 空间开销,但比反复拷贝快;原地法省空间但只适用于方阵。
- 正确填充示例:
for (int i = 0; i
- 如果编译器支持 C++20,可用
std::ranges::reverse简化翻转逻辑,但多数 OJ 还不支持 - 传参时若用
const std::vector<:vector>>&</:vector>,切勿在函数内试图修改原容器大小
测试时漏掉单行/单列边界情况
比如 1 x n 或 n x 1 输入,转置+翻转法仍适用,但手工映射容易写死 i 这类硬编码导致越界或跳过最后一行。
容易被忽略的地方:旋转 90° 是「顺时针」,不是「逆时针」;很多题库样例用的是顺时针,但描述模糊时务必看输入输出对。
- 单行数组(
1 x n)转完应为n x 1的列向量,第一行变最后一列 - 调试技巧:打印中间转置结果,确认是否真的行列互换了,再看翻转是否到位
- 如果用 GDB 或 VS 调试,观察内存布局时注意:
vector是连续的,但嵌套vector的每行内存不连续,别用指针算偏移
C++免费学习笔记(深入):立即使用
在学习笔记中,你将探索 C++ 的入门与实战技巧!











