今日算法之_50_旋转图像
前言
Github:https://github.com/HealerJean
1、旋转图像
给定一个 n × n 的二维矩阵表示一个图像。将图像顺时针旋转 90 度。
说明:你必须在原地旋转图像,这意味着你需要直接修改输入的二维矩阵。请不要使用另一个矩阵来旋转图像。
示例 1:
给定 matrix =
[
[1,2,3],
[4,5,6],
[7,8,9]
],
原地旋转输入矩阵,使其变为:
[
[7,4,1],
[8,5,2],
[9,6,3]
]
示例 2:
给定 matrix =
[
[ 5, 1, 9,11],
[ 2, 4, 8,10],
[13, 3, 6, 7],
[15,14,12,16]
],
原地旋转输入矩阵,使其变为:
[
[15,13, 2, 5],
[14, 3, 4, 1],
[12, 6, 8, 9],
[16, 7,10,11]
]
1.1、解题思路
本题主要是找规律,没别的思想
名词解释:
对角线 :按着左上到右下的对角线翻转 \
反对角线:按着右上到左下的对角线翻转 /
竖轴:按着平行于y轴的中心线翻转 |
横轴: 按着平行于x轴的中心线翻转 ——
90°:矩阵顺时针旋转90°
180°:矩阵顺时针旋转180°
270°:矩阵顺时针旋转270°
矩阵翻转规律如下
反转度数 | 操作 |
---|---|
90° | 对角线 + 竖轴 |
反对角线 + 横轴 | |
180° | 横轴 + 竖轴 |
270° | 对角线 + 横轴 |
反对角线 + 竖轴 |
翻转90° => 对角线 + 竖轴
1, 2, 3, 4,
5, 6, 7, 8,
9, 10, 11, 12,
13, 14, 15, 16,
1, 5, 9, 13,
2, 6, 10, 14,
3, 7, 11, 15,
4, 8, 12, 16,
13, 9, 5, 1,
14, 10, 6, 2,
15, 11, 7, 3,
16, 12, 8, 4,
1.2、算法
public void rotate(int[][] matrix) {
int n = matrix.length;
// 对于正对角线对称翻转
for (int i = 0; i < n; i++) {
for (int j = i; j < n; j++) {
int tmp = matrix[j][i];
matrix[j][i] = matrix[i][j];
matrix[i][j] = tmp;
}
}
MatrixPrint.print(matrix);
// 竖轴镜像操作
for (int i = 0; i < n; i++) {
for (int j = 0; j < n / 2; j++) {
int tmp = matrix[i][j];
matrix[i][j] = matrix[i][n - j - 1];
matrix[i][n - j - 1] = tmp;
}
}
}
1.3、测试
@Test
public void test() {
int[][] matrix = {
{ 1, 2, 3, 4},
{ 5, 6, 7, 8},
{ 9, 10, 11, 12},
{13, 14, 15, 16}
};
MatrixPrint.print(matrix);
rotate(matrix);
MatrixPrint.print(matrix);
}
控制台:
1, 2, 3, 4,
5, 6, 7, 8,
9, 10, 11, 12,
13, 14, 15, 16,
1, 5, 9, 13,
2, 6, 10, 14,
3, 7, 11, 15,
4, 8, 12, 16,
13, 9, 5, 1,
14, 10, 6, 2,
15, 11, 7, 3,
16, 12, 8, 4,