Skip to content

Commit e3afd38

Browse files
committed
48.旋转图像,置换
1 parent 6540d8d commit e3afd38

File tree

3 files changed

+96
-0
lines changed

3 files changed

+96
-0
lines changed

leetcode_Java/DoneTitle.txt

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -22,6 +22,7 @@
2222
41. 缺失的第一个正数
2323
46. 全排列
2424
47. 全排列 II
25+
48. 旋转图像
2526
42. 接雨水
2627
51. N 皇后
2728
53. 最大子数组和

leetcode_Java/DoneType.txt

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -143,6 +143,7 @@
143143
33. 搜索旋转排序数组(二分查找)
144144
34. 在排序数组中查找元素的第一个和最后一个位置(二分查找)
145145
41. 缺失的第一个正数(置换,排序,集合)
146+
48. 旋转图像(置换)
146147
54. 螺旋矩阵(四指针)
147148
56. 合并区间(二维数组排序)
148149
75. 颜色分类(单指针,双指针)

leetcode_Java/Solution0048.java

Lines changed: 94 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,94 @@
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

Comments
 (0)