Nameless Site

But one day, you will stand before its decrepit gate,without really knowing why.

0%

翻转图像

来源Leetcode第48题旋转图像

给定一个 n × n 的二维矩阵表示一个图像。

将图像顺时针旋转 90 度。

说明:

你必须在原地旋转图像,这意味着你需要直接修改输入的二维矩阵。请不要使用另一个矩阵来旋转图像

示例 1:

给定 matrix =
[
[1,2,3],
[4,5,6],
[7,8,9]
],

原地旋转输入矩阵,使其变为:
[
[7,4,1],
[8,5,2],
[9,6,3]
]

两次翻转

这题没什么思路,规律没找到。
看了题解之后知道可以通过上下翻转一次,在通过对角线翻转一次即可完成。

代码如下:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
class Solution {
public void rotate(int[][] matrix) {
int n = matrix.length;
//上下翻转
// n/2代表矩阵的中间线,以实现对折翻转
for (int i = 0; i < n / 2; i ++){
//保存欲翻转的当前行
int[] tmp = matrix[i];
//整行翻转
matrix[i] = matrix[n - i - 1];
matrix[n - i - 1] = tmp;
}

// 对角翻转
for (int i = 0; i < n; i ++){
for (int j= i + 1; j < n; j++){
int tmp = matrix[i][j];
matrix[i][j] = matrix[j][i];
matrix[j][i] = tmp;
}
}
}
}

四数交换

当然这题规律找出来了就是简单的四数交换,感谢木苡微澜的题解

代码如下:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
/*将举证旋转90度的方法:
* 矩阵例子:
[ 5, 1, 9, 11],
[ 2, 4, 8, 10],
[13, 3, 6, 7],
[15,14,12, 16]
*/

int length = matrix.length;// 给定的矩阵的边长
int lengthend = matrix.length;// 每一圈中分好的块的末尾元素的行或者列的下标(具体圈具体分析)

/* 由外而内,逐个圈进行旋转 */
for (int r = 0; r <= (length - 1) / 2; r++) {
/*
* 创建一个临时数组作为中转站,存放每一个块的数据,注意由外而内每一个圈的块的元素数量不同,
* 故临时数组长度不一样,用数理逻辑推出长度公式:length-2*r-1
*/
int[] temp = new int[length-2*r-1];

/*举例:(外圈情况)把第一个块元素放进临时数组temp中
[ 5, 1, 9, ], ==> temp[]
[ ],
[ ],
[ ]
*/
for (int i = 0; i < temp.length; i++) { // 这个i是临时数组的下标
temp[i] = matrix[r][i + r];
}

/*举例:(外圈情况)块[2,13,15]换到[5,1,9]的位置
[ 5, 1, 9, ],
[ 2, ],
[13, ],
[15, ]
*/
for (int i = 1 + r; i < lengthend; i++) {
matrix[r][length - 1 - i] = matrix[i][r];
}

/*举例:(外圈情况)块[14,12,16]换到[2,13,15]的位置
[ ],
[ 2, ],
[13, ],
[15,14,12,16]
*/
for (int i = 1 + r; i < lengthend; i++) {
matrix[i][r] = matrix[length - 1 - r][i];
}

/*举例:(外圈情况)块[11,10,7]换到[14,12,16]的位置
[ ,11],
[ ,10],
[ , 7],
[ ,14,12,16]
*/
for (int i = 1 + r; i < lengthend; i++) {
matrix[length - 1 - r][i] = matrix[length - 1 - i][length - 1 - r];
}

/*举例:(外圈情况)把临时数组temp中的元素放进第一个块中
*
temp[] ==> [ ],
[ ],
[ ],
[ ]
*/
for (int i = 1; i <= temp.length; i++) {
matrix[length - i - 1 - r][length - 1 - r] = temp[temp.length - i];
}

/*进入下一圈之前,这一圈中分好的块的末尾元素的行或者列的下标缩小一位*/
lengthend -= 1;
}


//将这几个循环写在一起就是这样

public void rotate(int[][] matrix) {
//由外而内,逐个圈进行旋转
int len = matrix.length >> 1;
for(int j = 0; j < len; j++) {
//定义由外而内每一个圈的块的元素数量
int lengthend = matrix.length - 1 - 2 * j;
for (int i = 0; i < lengthend; i++) {
//然后开始4个数4个数的交换
//第一轮的4个数是4个角的数
//然后在往右移,以此类推
int temp = matrix[j][i + j];
matrix[j][i + j] = matrix[matrix.length - 1 - j - i][j];
matrix[matrix.length - 1 - j - i][j] = matrix[matrix.length - 1 - j][matrix.length - 1 - j - i];
matrix[matrix.length - 1 - j][matrix.length - 1 - j - i] = matrix[j + i][matrix.length - 1 - j];
matrix[j + i][matrix.length - 1 - j] = temp;
}
}
}