逆时针旋转90度后为n×m数组,dsti = srcj;非方阵无法原地旋转,推荐新建数组映射赋值。

二维数组逆时针旋转90度的核心变换规则
直接结论:对一个 m × n 的二维数组,逆时针旋转90度后变成 n × m 数组,新位置 dst[i][j] = src[j][m-1-i]。别记错方向——顺时针是 src[n-1-j][i],逆时针刚好相反。
这个公式背后是坐标系旋转:原数组行索引向下增长,列向右;逆时针转90°后,原列变成新行,且顺序反转(最上一行变成最右一列,但要倒着填)。
原地旋转?C++里基本不可行,除非是方阵且手动换位
非方阵(m ≠ n)根本没法原地做——内存布局不支持行列互换。即使 m == n,逆时针90度的原地实现也比顺时针更绕,容易出错。
- 推荐统一用「新建目标数组 + 映射赋值」,逻辑清晰、无副作用
- 若坚持原地,必须用 4 元素轮换,且循环边界计算复杂:
for (int i = 0; i ,再套 4 步交换,极易索引越界 -
std::vector<:vector>></:vector>无法直接resize行列互换,得先resize(n)每行,再逐行resize(m)
用 vector 实现的安全写法(含边界检查)
假设输入是 std::vector<:vector>> mat</:vector>,注意空数组和单行/单列的 corner case:
if (mat.empty() || mat[0].empty()) return {};
int m = mat.size(), n = mat[0].size();
std::vector<:vector>> res(n, std::vector<int>(m)); // n行,每行m个
for (int i = 0; i <p>这里 <code>m-1-i</code> 是关键:原第 <code>j</code> 列整体变成新第 <code>i</code> 行,而原第 <code>0</code> 行要落到新行的末尾,所以用 <code>m-1-i</code> 倒序取。</p>
<h3>用 raw array 时的常见错误</h3>
<p>C 风格二维数组(如 <code>int arr[3][4]</code>)不能直接传参旋转——函数参数必须明确第二维长度,且无法动态改尺寸。</p>
<ul>
<li>错误写法:<code>void rotate(int a[][n], int m, int n)</code> —— <code>n</code> 在编译期未定义,不合法</li>
<li>正确做法:传指针 + 手动算偏移,或封装成 <code>std::array<:array>, 3></:array></code> 这种固定尺寸类型</li>
<li>最容易漏的坑:<code>mat[j][m-1-i]</code> 中 <code>m-1-i</code> 可能为负(当 <code>i >= m</code>),但循环里 <code>i ,所以只要保证 <code>n ?不,完全无关——<code>i</code> 范围是 <code>[0, n)</code>,<code>m-1-i</code> 下限是 <code>m-1-(n-1) = m-n</code>,若 <code>m 就越界!所以必须确保循环变量范围与源数组维度匹配,上面代码中 <code>i</code> 遍历的是新行数 <code>n</code>,<code>j</code> 遍历的是新列数 <code>m</code>,而访问 <code>mat[j][...]</code> 要求 <code>j ,因此循环上限必须是 <code>j ,不是 <code>j </code></code></code></code></code></code>
</li>
</ul>
<p>真正安全的 raw array 版本几乎总要配合模板或宏来推导尺寸,实际项目里不如直接用 vector。</p></int></:vector>C++免费学习笔记(深入):立即使用
在学习笔记中,你将探索 C++ 的入门与实战技巧!











