49
49
50
50
<!-- 这里可写通用的实现逻辑 -->
51
51
52
+ ** 方法一:逐层模拟**
53
+
54
+ 我们先计算得到矩阵的层数 $p$,然后从外到内逐层模拟循环轮转的过程。
55
+
56
+ 对于每一层,我们按照顺时针方向,将上、右、下、左四条边的元素依次放入数组 $nums$ 中。记数组 $nums$ 的长度为 $l$。接下来,我们将 $k$ 模 $l$。然后从数组的第 $k$ 个位置开始,将数组中的元素依次放回矩阵的上、右、下、左四条边。
57
+
58
+ 时间复杂度 $O(m \times n)$,空间复杂度 $O(m + n)$。其中 $m$ 和 $n$ 分别是矩阵的行数和列数。
59
+
52
60
<!-- tabs:start -->
53
61
54
62
### ** Python3**
58
66
``` python
59
67
class Solution :
60
68
def rotateGrid (self , grid : List[List[int ]], k : int ) -> List[List[int ]]:
61
- def rotate (grid , s1 , e1 , s2 , e2 , k ):
62
- t = []
63
- for j in range (e2, e1, - 1 ):
64
- t.append(grid[s1][j])
65
- for i in range (s1, s2):
66
- t.append(grid[i][e1])
67
- for j in range (e1, e2):
68
- t.append(grid[s2][j])
69
- for i in range (s2, s1, - 1 ):
70
- t.append(grid[i][e2])
71
- k %= len (t)
72
- t = t[- k:] + t[:- k]
69
+ def rotate (p : int , k : int ):
70
+ nums = []
71
+ for j in range (p, n - p - 1 ):
72
+ nums.append(grid[p][j])
73
+ for i in range (p, m - p - 1 ):
74
+ nums.append(grid[i][n - p - 1 ])
75
+ for j in range (n - p - 1 , p, - 1 ):
76
+ nums.append(grid[m - p - 1 ][j])
77
+ for i in range (m - p - 1 , p, - 1 ):
78
+ nums.append(grid[i][p])
79
+ k %= len (nums)
80
+ if k == 0 :
81
+ return
82
+ nums = nums[k:] + nums[:k]
73
83
k = 0
74
- for j in range (e2, e1, - 1 ):
75
- grid[s1 ][j] = t [k]
84
+ for j in range (p, n - p - 1 ):
85
+ grid[p ][j] = nums [k]
76
86
k += 1
77
- for i in range (s1, s2 ):
78
- grid[i][e1 ] = t [k]
87
+ for i in range (p, m - p - 1 ):
88
+ grid[i][n - p - 1 ] = nums [k]
79
89
k += 1
80
- for j in range (e1, e2 ):
81
- grid[s2 ][j] = t [k]
90
+ for j in range (n - p - 1 , p, - 1 ):
91
+ grid[m - p - 1 ][j] = nums [k]
82
92
k += 1
83
- for i in range (s2, s1 , - 1 ):
84
- grid[i][e2 ] = t [k]
93
+ for i in range (m - p - 1 , p , - 1 ):
94
+ grid[i][p ] = nums [k]
85
95
k += 1
86
96
87
97
m, n = len (grid), len (grid[0 ])
88
- s1 = e1 = 0
89
- s2, e2 = m - 1 , n - 1
90
- while s1 <= s2 and e1 <= e2:
91
- rotate(grid, s1, e1, s2, e2, k)
92
- s1 += 1
93
- e1 += 1
94
- s2 -= 1
95
- e2 -= 1
98
+ for p in range (min (m, n) >> 1 ):
99
+ rotate(p, k)
96
100
return grid
97
101
```
98
102
@@ -102,53 +106,194 @@ class Solution:
102
106
103
107
``` java
104
108
class Solution {
109
+ private int m;
110
+ private int n;
111
+ private int [][] grid;
112
+
105
113
public int [][] rotateGrid (int [][] grid , int k ) {
106
- int m = grid. length, n = grid[ 0 ] . length;
107
- int s1 = 0 , e1 = 0 ;
108
- int s2 = m - 1 , e2 = n - 1 ;
109
- while (s1 <= s2 && e1 <= e2 ) {
110
- rotate(grid, s1 ++ , e1 ++ , s2 -- , e2 -- , k);
114
+ m = grid. length;
115
+ n = grid[ 0 ] . length ;
116
+ this . grid = grid ;
117
+ for ( int p = 0 ; p < Math . min(m, n) / 2 ; ++ p ) {
118
+ rotate(p , k);
111
119
}
112
120
return grid;
113
121
}
114
122
115
- private void rotate (int [][] grid , int s1 , int e1 , int s2 , int e2 , int k ) {
116
- List<Integer > t = new ArrayList<> ();
117
- for (int j = e2 ; j > e1; -- j) {
118
- t . add(grid[s1 ][j]);
123
+ private void rotate (int p , int k ) {
124
+ List<Integer > nums = new ArrayList<> ();
125
+ for (int j = p ; j < n - p - 1 ; ++ j) {
126
+ nums . add(grid[p ][j]);
119
127
}
120
- for (int i = s1 ; i < s2 ; ++ i) {
121
- t . add(grid[i][e1 ]);
128
+ for (int i = p ; i < m - p - 1 ; ++ i) {
129
+ nums . add(grid[i][n - p - 1 ]);
122
130
}
123
- for (int j = e1 ; j < e2; ++ j) {
124
- t . add(grid[s2 ][j]);
131
+ for (int j = n - p - 1 ; j > p; -- j) {
132
+ nums . add(grid[m - p - 1 ][j]);
125
133
}
126
- for (int i = s2 ; i > s1 ; -- i) {
127
- t . add(grid[i][e2 ]);
134
+ for (int i = m - p - 1 ; i > p ; -- i) {
135
+ nums . add(grid[i][p ]);
128
136
}
129
- int n = t . size();
130
- k %= n ;
137
+ int l = nums . size();
138
+ k %= l ;
131
139
if (k == 0 ) {
132
140
return ;
133
141
}
134
- k = n - k;
135
- for (int j = e2; j > e1; -- j) {
136
- grid[s1][j] = t. get(k);
137
- k = (k + 1 ) % n;
142
+ for (int j = p; j < n - p - 1 ; ++ j) {
143
+ grid[p][j] = nums. get(k++ % l);
144
+ }
145
+ for (int i = p; i < m - p - 1 ; ++ i) {
146
+ grid[i][n - p - 1 ] = nums. get(k++ % l);
147
+ }
148
+ for (int j = n - p - 1 ; j > p; -- j) {
149
+ grid[m - p - 1 ][j] = nums. get(k++ % l);
150
+ }
151
+ for (int i = m - p - 1 ; i > p; -- i) {
152
+ grid[i][p] = nums. get(k++ % l);
153
+ }
154
+ }
155
+ }
156
+ ```
157
+
158
+ ### ** C++**
159
+
160
+ ``` cpp
161
+ class Solution {
162
+ public:
163
+ vector<vector<int >> rotateGrid(vector<vector<int >>& grid, int k) {
164
+ int m = grid.size(), n = grid[ 0] .size();
165
+ auto rotate = [ &] (int p, int k) {
166
+ vector<int > nums;
167
+ for (int j = p; j < n - p - 1; ++j) {
168
+ nums.push_back(grid[ p] [ j ] );
169
+ }
170
+ for (int i = p; i < m - p - 1; ++i) {
171
+ nums.push_back(grid[ i] [ n - p - 1 ] );
172
+ }
173
+ for (int j = n - p - 1; j > p; --j) {
174
+ nums.push_back(grid[ m - p - 1] [ j ] );
175
+ }
176
+ for (int i = m - p - 1; i > p; --i) {
177
+ nums.push_back(grid[ i] [ p ] );
178
+ }
179
+ int l = nums.size();
180
+ k %= l;
181
+ if (k == 0) {
182
+ return;
183
+ }
184
+ for (int j = p; j < n - p - 1; ++j) {
185
+ grid[ p] [ j ] = nums[ k++ % l] ;
186
+ }
187
+ for (int i = p; i < m - p - 1; ++i) {
188
+ grid[ i] [ n - p - 1 ] = nums[ k++ % l] ;
189
+ }
190
+ for (int j = n - p - 1; j > p; --j) {
191
+ grid[ m - p - 1] [ j ] = nums[ k++ % l] ;
192
+ }
193
+ for (int i = m - p - 1; i > p; --i) {
194
+ grid[ i] [ p ] = nums[ k++ % l] ;
195
+ }
196
+ };
197
+ for (int p = 0; p < min(m, n) / 2; ++p) {
198
+ rotate(p, k);
199
+ }
200
+ return grid;
201
+ }
202
+ };
203
+ ```
204
+
205
+ ### **Go**
206
+
207
+ ```go
208
+ func rotateGrid(grid [][]int, k int) [][]int {
209
+ m, n := len(grid), len(grid[0])
210
+
211
+ rotate := func(p, k int) {
212
+ nums := []int{}
213
+ for j := p; j < n-p-1; j++ {
214
+ nums = append(nums, grid[p][j])
215
+ }
216
+ for i := p; i < m-p-1; i++ {
217
+ nums = append(nums, grid[i][n-p-1])
218
+ }
219
+ for j := n - p - 1; j > p; j-- {
220
+ nums = append(nums, grid[m-p-1][j])
221
+ }
222
+ for i := m - p - 1; i > p; i-- {
223
+ nums = append(nums, grid[i][p])
224
+ }
225
+ l := len(nums)
226
+ k %= l
227
+ if k == 0 {
228
+ return
229
+ }
230
+ for j := p; j < n-p-1; j++ {
231
+ grid[p][j] = nums[k]
232
+ k = (k + 1) % l
233
+ }
234
+ for i := p; i < m-p-1; i++ {
235
+ grid[i][n-p-1] = nums[k]
236
+ k = (k + 1) % l
237
+ }
238
+ for j := n - p - 1; j > p; j-- {
239
+ grid[m-p-1][j] = nums[k]
240
+ k = (k + 1) % l
241
+ }
242
+ for i := m - p - 1; i > p; i-- {
243
+ grid[i][p] = nums[k]
244
+ k = (k + 1) % l
245
+ }
246
+ }
247
+
248
+ for i := 0; i < m/2 && i < n/2; i++ {
249
+ rotate(i, k)
250
+ }
251
+ return grid
252
+ }
253
+ ```
254
+
255
+ ### ** TypeScript**
256
+
257
+ ``` ts
258
+ function rotateGrid(grid : number [][], k : number ): number [][] {
259
+ const m = grid .length ;
260
+ const n = grid [0 ].length ;
261
+ const rotate = (p : number , k : number ) => {
262
+ const nums: number [] = [];
263
+ for (let j = p ; j < n - p - 1 ; ++ j ) {
264
+ nums .push (grid [p ][j ]);
265
+ }
266
+ for (let i = p ; i < m - p - 1 ; ++ i ) {
267
+ nums .push (grid [i ][n - p - 1 ]);
268
+ }
269
+ for (let j = n - p - 1 ; j > p ; -- j ) {
270
+ nums .push (grid [m - p - 1 ][j ]);
271
+ }
272
+ for (let i = m - p - 1 ; i > p ; -- i ) {
273
+ nums .push (grid [i ][p ]);
274
+ }
275
+ const l = nums .length ;
276
+ k %= l ;
277
+ if (k === 0 ) {
278
+ return ;
279
+ }
280
+ for (let j = p ; j < n - p - 1 ; ++ j ) {
281
+ grid [p ][j ] = nums [k ++ % l ];
138
282
}
139
- for (int i = s1; i < s2; ++ i) {
140
- grid[i][e1] = t. get(k);
141
- k = (k + 1 ) % n;
283
+ for (let i = p ; i < m - p - 1 ; ++ i ) {
284
+ grid [i ][n - p - 1 ] = nums [k ++ % l ];
142
285
}
143
- for (int j = e1; j < e2; ++ j) {
144
- grid[s2][j] = t. get(k);
145
- k = (k + 1 ) % n;
286
+ for (let j = n - p - 1 ; j > p ; -- j ) {
287
+ grid [m - p - 1 ][j ] = nums [k ++ % l ];
146
288
}
147
- for (int i = s2; i > s1; -- i) {
148
- grid[i][e2] = t. get(k);
149
- k = (k + 1 ) % n;
289
+ for (let i = m - p - 1 ; i > p ; -- i ) {
290
+ grid [i ][p ] = nums [k ++ % l ];
150
291
}
292
+ };
293
+ for (let p = 0 ; p < Math .min (m , n ) >> 1 ; ++ p ) {
294
+ rotate (p , k );
151
295
}
296
+ return grid ;
152
297
}
153
298
```
154
299
0 commit comments