原地翻转矩阵需先转置再镜像:先沿主对角线转置,再对每行左右镜像;二者均为原地操作,时间复杂度O(n²),空间复杂度O(1);镜像时循环范围应为j < n/2,否则导致重复交换。

原地翻转必须先转置再镜像
直接计算每个元素的目标坐标并交换,会导致部分位置被覆盖或重复操作。正确做法是分两步:先沿主对角线转置矩阵,再对每行做左右镜像。这两步都是原地操作,时间复杂度 O(n²),空间复杂度 O(1)。
常见错误是镜像时用 swap(matrix[i][j], matrix[i][n-1-j]) 但循环范围写成 j = 0; j ,结果左右翻两次回到原状。实际只需遍历每行的前半部分:
for (int i = 0; i < n; i++) {
for (int j = 0; j < n / 2; j++) {
swap(matrix[i][j], matrix[i][n - 1 - j]);
}
}
转置时行列索引不能写反
转置的本质是让 matrix[i][j] 和 matrix[j][i] 交换。如果嵌套循环都从 0 到 n,会把所有元素交换两次,等于没动。必须保证只处理上三角(或下三角)区域:
- 外层
i从0到n-1 - 内层
j从i+1到n-1,跳过对角线及以下
写成 j = i 或 j = 0 都会导致数据错乱,尤其在奇数阶矩阵中容易暴露问题。
立即学习“C++免费学习笔记(深入)”;
非方阵无法原地90度翻转
std::vector<:vector>></:vector> 类型若行数 m ≠ 列数 n,就无法在原容器内完成顺时针90度旋转——因为结果矩阵维度是 n × m,内存布局不兼容。此时必须新建一个 vector<vector>>(n, vector<int>(m))</int></vector> 并用坐标映射填值:
for (int i = 0; i < m; i++) {
for (int j = 0; j < n; j++) {
rotated[j][m - 1 - i] = matrix[i][j];
}
}
注意目标索引是 [j][m-1-i],不是 [n-1-j][i],后者对应的是逆时针90度。
使用 std::swap 比手写临时变量更安全
手动用临时变量交换二维数组元素时,容易因笔误写成 tmp = matrix[i][j]; matrix[i][j] = matrix[j][i]; matrix[j][i] = tmp; 却忘了 i != j 时该限制循环范围,导致对角线元素被自己覆盖(虽然值不变,但逻辑冗余且易误导)。而 std::swap 语义清晰,编译器还能优化为移动语义(对自定义类型尤其重要)。
另外,如果矩阵元素类型是 std::string 或含资源管理的类,手写交换可能引发深拷贝或异常,std::swap 能自动调用特化版本。
边界情况最容易出问题的地方是索引越界和循环范围重叠,检查时重点盯住 n/2、i+1、m-1-i 这三类偏移表达式。


















