1
+ // 48. 旋转图像
2
+
3
+
4
+ /*
5
+ 翻转:
6
+ 1、对角线翻转:对角线元素交换
7
+ 2、水平翻转:左右两侧元素交换
8
+
9
+ 1 2 3 1 4 7 7 4 1
10
+ 4 5 6 → 2 5 8 → 8 5 2
11
+ 7 8 9 3 6 9 9 6 3
12
+ */
13
+ class Solution {
14
+ public void rotate (int [][] matrix ) {
15
+ int n = matrix .length ;
16
+ for (int i = 0 ; i < n ; i ++) {
17
+ for (int j = 0 ; j < i ; j ++) {
18
+ int temp = matrix [i ][j ];
19
+ matrix [i ][j ] = matrix [j ][i ];
20
+ matrix [j ][i ] = temp ;
21
+ }
22
+ }
23
+ for (int i = 0 ; i < n ; i ++) {
24
+ for (int j = 0 ; j < n / 2 ; j ++) {
25
+ int temp = matrix [i ][j ];
26
+ matrix [i ][j ] = matrix [i ][n - 1 - j ];
27
+ matrix [i ][n - 1 - j ] = temp ;
28
+ }
29
+ }
30
+ }
31
+ }
32
+
33
+
34
+ /*
35
+ 原地旋转:
36
+ 1、箭头横向是行,纵向是列
37
+ 2、确定旋转位置,定位一个点,推算出旋转后在对应四个位置上的索引,每次遍历都是交换这四个点的位置
38
+ 1)赋值方向:(i, j) → (j, n-1-i) → (n-1-i, n-1-j) → (n-1-j, i) → (i, j)
39
+ 2)索引变化规律:
40
+ ① 当前点的列 直接变成 下一点的行 ( ,x) → (x, )
41
+ ② 当前点的行 转化变成 下一点的列 (x, ) → ( ,n-1-x) (n-1-x, ) → ( ,x)
42
+ ③ 确定下一选择位置的索引,直接根据以上两个规律写出坐标
43
+ 3、确定遍历范围,每次遍历都是操作四个点,所以只需要遍历 n²/4 个格子即可,对n为偶数和奇数的情况将格子四等分,推算出统一的遍历范围
44
+ 0 <= i < n/2
45
+ 0 <= j < (n+1)/2
46
+
47
+ j
48
+ ↓
49
+ i → 1 2 3 4 5
50
+ 6 7 8 9 10
51
+ 11 12 13 14 15
52
+ 16 17 18 19 20
53
+ 21 22 23 24 25
54
+
55
+ n-1-i
56
+ ↓
57
+ 1 2 3 4 5
58
+ 6 7 8 9 10 ← j
59
+ 11 12 13 14 15
60
+ 16 17 18 19 20
61
+ 21 22 23 24 25
62
+
63
+ 1 2 3 4 5
64
+ 6 7 8 9 10
65
+ 11 12 13 14 15
66
+ 16 17 18 19 20
67
+ 21 22 23 24 25 ← n-1-i
68
+ ↑
69
+ n-1-j
70
+
71
+ 1 2 3 4 5
72
+ 6 7 8 9 10
73
+ 11 12 13 14 15
74
+ n-1-j → 16 17 18 19 20
75
+ 21 22 23 24 25
76
+ ↑
77
+ i
78
+
79
+ */
80
+ class Solution {
81
+ public void rotate (int [][] matrix ) {
82
+ int n = matrix .length ;
83
+ int row = n / 2 , col = (n + 1 ) / 2 ;
84
+ for (int i = 0 ; i < row ; i ++) {
85
+ for (int j = 0 ; j < col ; j ++) {
86
+ int temp = matrix [i ][j ];
87
+ matrix [i ][j ] = matrix [n - 1 - j ][i ];
88
+ matrix [n - 1 - j ][i ] = matrix [n - 1 - i ][n - 1 - j ];
89
+ matrix [n - 1 - i ][n - 1 - j ] = matrix [j ][n - 1 - i ];
90
+ matrix [j ][n - 1 - i ] = temp ;
91
+ }
92
+ }
93
+ }
94
+ }
0 commit comments