给定一个 n × n 的二维矩阵 matrix 表示一个图像。请你将图像顺时针旋转 90 度。
你必须在 原地 旋转图像,这意味着你需要直接修改输入的二维矩阵。请不要 使用另一个矩阵来旋转图像。
思路
从数学角度来思考,这个是一个旋转角度的问题, 但是值得注意的是:
以中心点((n-1)/2,(n-1)/2)为参考点进行旋转90度,运用数学知识,
设初始坐标为(p, k),旋转后位置为 (x, y)
原向量 a = (p - (n-1)/2, k - (n-1)/2), 旋转后向量 b = (x - (n-1)/2, y - (n-1)/2)
不难得出 a的横向长度等于b的纵向长度
根据中心点的左上、左下、右上、右下四个部分进行分类讨论, 有点复杂。。。
更为trick 的做法: 先根据行中轴线翻转,再根据主对角线翻转,第一步只需要将y轴坐标设置为n-1-p, 第二步是矩阵转置
代码
private static void retolate(int[][] a) {
int n = a.length;
for (int i = 0; i < n / 2; i++) {
for (int j = 0; j < n; j++) {
int t = a[i][j];
a[i][j] = a[n - 1 - i][j];
a[n - 1 - i][j] = t;
}
}
for (int i = 0; i < n; i++) {
for (int j = 0; j < n && j < i; j++) {
int t = a[i][j];
a[i][j] = a[j][i];
a[j][i] = t;
}
}
}