42
42
43
43
<!-- 这里可写通用的实现逻辑 -->
44
44
45
+ ** 方法一:原地翻转**
46
+
47
+ 根据题目要求,我们实际上需要将 $matrix[ i] [ j ] $ 旋转至 $matrix[ j] [ n - i - 1 ] $。
48
+
49
+ 我们可以先对矩阵进行上下翻转,即 $matrix[ i] [ j ] $ 和 $matrix[ n - i - 1] [ j ] $ 进行交换,然后再对矩阵进行主对角线翻转,即 $matrix[ i] [ j ] $ 和 $matrix[ j] [ i ] $ 进行交换。这样就能将 $matrix[ i] [ j ] $ 旋转至 $matrix[ j] [ n - i - 1 ] $ 了。
50
+
51
+ 时间复杂度 $O(n^2)$,其中 $n$ 是矩阵的边长。空间复杂度 $O(1)$。
52
+
45
53
<!-- tabs:start -->
46
54
47
55
### ** Python3**
51
59
``` python
52
60
class Solution :
53
61
def rotate (self , matrix : List[List[int ]]) -> None :
54
- """
55
- Do not return anything, modify matrix in-place instead.
56
- """
57
- s, n = 0 , len (matrix)
58
- while s < (n >> 1 ):
59
- e = n - s - 1
60
- for i in range (s, e):
61
- t = matrix[i][e]
62
- matrix[i][e] = matrix[s][i]
63
- matrix[s][i] = matrix[n - i - 1 ][s]
64
- matrix[n - i - 1 ][s] = matrix[e][n - i - 1 ]
65
- matrix[e][n - i - 1 ] = t
66
- s += 1
62
+ n = len (matrix)
63
+ for i in range (n >> 1 ):
64
+ for j in range (n):
65
+ matrix[i][j], matrix[n - i - 1 ][j] = matrix[n - i - 1 ][j], matrix[i][j]
66
+ for i in range (n):
67
+ for j in range (i):
68
+ matrix[i][j], matrix[j][i] = matrix[j][i], matrix[i][j]
67
69
```
68
70
69
71
### ** Java**
@@ -73,17 +75,20 @@ class Solution:
73
75
``` java
74
76
class Solution {
75
77
public void rotate (int [][] matrix ) {
76
- int s = 0 , n = matrix. length;
77
- while (s < (n >> 1 )) {
78
- int e = n - s - 1 ;
79
- for (int i = s; i < e; ++ i) {
80
- int t = matrix[i][e];
81
- matrix[i][e] = matrix[s][i];
82
- matrix[s][i] = matrix[n - i - 1 ][s];
83
- matrix[n - i - 1 ][s] = matrix[e][n - i - 1 ];
84
- matrix[e][n - i - 1 ] = t;
78
+ int n = matrix. length;
79
+ for (int i = 0 ; i < n >> 1 ; ++ i) {
80
+ for (int j = 0 ; j < n; ++ j) {
81
+ int t = matrix[i][j];
82
+ matrix[i][j] = matrix[n - i - 1 ][j];
83
+ matrix[n - i - 1 ][j] = t;
84
+ }
85
+ }
86
+ for (int i = 0 ; i < n; ++ i) {
87
+ for (int j = 0 ; j < i; ++ j) {
88
+ int t = matrix[i][j];
89
+ matrix[i][j] = matrix[j][i];
90
+ matrix[j][i] = t;
85
91
}
86
- ++ s;
87
92
}
88
93
}
89
94
}
@@ -95,58 +100,50 @@ class Solution {
95
100
class Solution {
96
101
public:
97
102
void rotate(vector<vector<int >>& matrix) {
98
-
99
103
int n = matrix.size();
100
- if (n <= 1) return;
101
-
102
- // 先做转置
103
- for (int i = 0; i < n; i++) {
104
- for (int j = i; j < n; j++) {
105
- swap(matrix[i][j], matrix[j][i]);
104
+ for (int i = 0; i < n >> 1; ++i) {
105
+ for (int j = 0; j < n; ++j) {
106
+ swap(matrix[ i] [ j ] , matrix[ n - i - 1] [ j ] );
106
107
}
107
108
}
108
-
109
- // 再做水平互换
110
- for (int i = 0 ; i < n; i++) {
111
- for (int j = 0; j < n / 2; j++) {
112
- swap (matrix[ i] [ j ] , matrix[ i] [ n - 1 - j ] );
109
+ for (int i = 0; i < n; ++i) {
110
+ for (int j = 0; j < i; ++j) {
111
+ swap(matrix[ i] [ j ] , matrix[ j] [ i ] );
113
112
}
114
113
}
115
114
}
116
115
};
117
116
```
118
117
119
- ### ** JavaScript **
118
+ ### **Go **
120
119
121
- ``` js
122
- /**
123
- * @param {number[][]} matrix
124
- * @return {void} Do not return anything, modify matrix in-place instead.
125
- */
126
- var rotate = function (matrix ) {
127
- const n = matrix .length ;
128
- for (let i = 0 ; i < n; i++ ) {
129
- for (let j = 0 ; j <= i; j++ ) {
130
- [matrix[i][j], matrix[j][i]] = [matrix[j][i], matrix[i][j]];
131
- }
132
- }
133
- for (let i = 0 , j = n - 1 ; i < j; i++ , j-- ) {
134
- for (let k = 0 ; k < n; k++ ) {
135
- [matrix[k][i], matrix[k][j]] = [matrix[k][j], matrix[k][i]];
136
- }
137
- }
138
- };
120
+ ```go
121
+ func rotate(matrix [][]int) {
122
+ n := len(matrix)
123
+ for i := 0; i < n>>1; i++ {
124
+ for j := 0; j < n; j++ {
125
+ matrix[i][j], matrix[n-i-1][j] = matrix[n-i-1][j], matrix[i][j]
126
+ }
127
+ }
128
+ for i := 0; i < n; i++ {
129
+ for j := 0; j < i; j++ {
130
+ matrix[i][j], matrix[j][i] = matrix[j][i], matrix[i][j]
131
+ }
132
+ }
133
+ }
139
134
```
140
135
136
+ ### ** JavaScript**
137
+
141
138
``` js
142
139
/**
143
140
* @param {number[][]} matrix
144
141
* @return {void} Do not return anything, modify matrix in-place instead.
145
142
*/
146
143
var rotate = function (matrix ) {
147
144
matrix .reverse ();
148
- for (let i = 0 ; i < matrix .length ; i ++ ) {
149
- for (let j = 0 ; j < i; j ++ ) {
145
+ for (let i = 0 ; i < matrix .length ; ++ i ) {
146
+ for (let j = 0 ; j < i; ++ j ) {
150
147
[matrix[i][j], matrix[j][i]] = [matrix[j][i], matrix[i][j]];
151
148
}
152
149
}
@@ -160,14 +157,36 @@ var rotate = function (matrix) {
160
157
Do not return anything, modify matrix in-place instead.
161
158
*/
162
159
function rotate(matrix : number [][]): void {
163
- let n = matrix [0 ].length ;
164
- for (let i = 0 ; i < Math .floor (n / 2 ); i ++ ) {
165
- for (let j = 0 ; j < Math .floor ((n + 1 ) / 2 ); j ++ ) {
166
- let tmp = matrix [i ][j ];
167
- matrix [i ][j ] = matrix [n - 1 - j ][i ];
168
- matrix [n - 1 - j ][i ] = matrix [n - 1 - i ][n - 1 - j ];
169
- matrix [n - 1 - i ][n - 1 - j ] = matrix [j ][n - 1 - i ];
170
- matrix [j ][n - 1 - i ] = tmp ;
160
+ matrix .reverse ();
161
+ for (let i = 0 ; i < matrix .length ; ++ i ) {
162
+ for (let j = 0 ; j < i ; ++ j ) {
163
+ const t = matrix [i ][j ];
164
+ matrix [i ][j ] = matrix [j ][i ];
165
+ matrix [j ][i ] = t ;
166
+ }
167
+ }
168
+ }
169
+ ```
170
+
171
+ ### ** C#**
172
+
173
+ ``` cs
174
+ public class Solution {
175
+ public void Rotate (int [][] matrix ) {
176
+ int n = matrix .Length ;
177
+ for (int i = 0 ; i < n >> 1 ; ++ i ) {
178
+ for (int j = 0 ; j < n ; ++ j ) {
179
+ int t = matrix [i ][j ];
180
+ matrix [i ][j ] = matrix [n - i - 1 ][j ];
181
+ matrix [n - i - 1 ][j ] = t ;
182
+ }
183
+ }
184
+ for (int i = 0 ; i < n ; ++ i ) {
185
+ for (int j = 0 ; j < i ; ++ j ) {
186
+ int t = matrix [i ][j ];
187
+ matrix [i ][j ] = matrix [j ][i ];
188
+ matrix [j ][i ] = t ;
189
+ }
171
190
}
172
191
}
173
192
}
@@ -179,38 +198,24 @@ function rotate(matrix: number[][]): void {
179
198
impl Solution {
180
199
pub fn rotate (matrix : & mut Vec <Vec <i32 >>) {
181
200
let n = matrix . len ();
182
- for i in 0 .. n / 2 {
183
- for j in i .. n - i - 1 {
201
+ for i in 0 .. n / 2 {
202
+ for j in 0 .. n {
203
+ let t = matrix [i ][j ];
204
+ matrix [i ][j ] = matrix [n - i - 1 ][j ];
205
+ matrix [n - i - 1 ][j ] = t ;
206
+ }
207
+ }
208
+ for i in 0 .. n {
209
+ for j in 0 .. i {
184
210
let t = matrix [i ][j ];
185
- matrix [i ][j ] = matrix [n - j - 1 ][i ];
186
- matrix [n - j - 1 ][i ] = matrix [n - i - 1 ][n - j - 1 ];
187
- matrix [n - i - 1 ][n - j - 1 ] = matrix [j ][n - i - 1 ];
188
- matrix [j ][n - i - 1 ] = t ;
211
+ matrix [i ][j ] = matrix [j ][i ];
212
+ matrix [j ][i ] = t ;
189
213
}
190
214
}
191
215
}
192
216
}
193
217
```
194
218
195
- ### ** Go**
196
-
197
- ``` go
198
- func rotate (matrix [][]int ) {
199
- n := len (matrix)
200
- for i := 0 ; i < n; i++ {
201
- for j := i; j < n; j++ {
202
- matrix[i][j], matrix[j][i] = matrix[j][i], matrix[i][j]
203
- }
204
- }
205
-
206
- for i := 0 ; i < n; i++ {
207
- for j , k := 0 , n-1 ; j < k; j, k = j+1 , k-1 {
208
- matrix[i][j], matrix[i][k] = matrix[i][k], matrix[i][j]
209
- }
210
- }
211
- }
212
- ```
213
-
214
219
### ** ...**
215
220
216
221
```
0 commit comments