逆时针旋转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:
立即学习“C++免费学习笔记(深入)”;
if (mat.empty() || mat[0].empty()) return {};
int m = mat.size(), n = mat[0].size();
std::vector<std::vector<int>> res(n, std::vector<int>(m)); // n行,每行m个
for (int i = 0; i < n; i++) {
for (int j = 0; j < m; j++) {
res[i][j] = mat[j][m - 1 - i]; // 关键映射
}
}
这里 m-1-i 是关键:原第 j 列整体变成新第 i 行,而原第 0 行要落到新行的末尾,所以用 m-1-i 倒序取。
用 raw array 时的常见错误
C 风格二维数组(如 int arr[3][4])不能直接传参旋转——函数参数必须明确第二维长度,且无法动态改尺寸。
- 错误写法:
void rotate(int a[][n], int m, int n)——n在编译期未定义,不合法 - 正确做法:传指针 + 手动算偏移,或封装成
std::array<:array>, 3></:array>这种固定尺寸类型 - 最容易漏的坑:
mat[j][m-1-i]中m-1-i可能为负(当i >= m),但循环里i ,所以只要保证 <code>n ?不,完全无关——<code>i范围是[0, n),m-1-i下限是m-1-(n-1) = m-n,若m 就越界!所以必须确保循环变量范围与源数组维度匹配,上面代码中 <code>i遍历的是新行数n,j遍历的是新列数m,而访问mat[j][...]要求j ,因此循环上限必须是 <code>j ,不是 <code>j
真正安全的 raw array 版本几乎总要配合模板或宏来推导尺寸,实际项目里不如直接用 vector。


















