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