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












