Skip to content

Commit c3efaf8

Browse files
authored
feat: add solutions to lc problem: No.1914 (#1372)
No.1914.Cyclically Rotating a Grid
1 parent 15d0220 commit c3efaf8

File tree

7 files changed

+606
-202
lines changed

7 files changed

+606
-202
lines changed

solution/1900-1999/1914.Cyclically Rotating a Grid/README.md

+203-58
Original file line numberDiff line numberDiff line change
@@ -49,6 +49,14 @@
4949

5050
<!-- 这里可写通用的实现逻辑 -->
5151

52+
**方法一:逐层模拟**
53+
54+
我们先计算得到矩阵的层数 $p$,然后从外到内逐层模拟循环轮转的过程。
55+
56+
对于每一层,我们按照顺时针方向,将上、右、下、左四条边的元素依次放入数组 $nums$ 中。记数组 $nums$ 的长度为 $l$。接下来,我们将 $k$ 模 $l$。然后从数组的第 $k$ 个位置开始,将数组中的元素依次放回矩阵的上、右、下、左四条边。
57+
58+
时间复杂度 $O(m \times n)$,空间复杂度 $O(m + n)$。其中 $m$ 和 $n$ 分别是矩阵的行数和列数。
59+
5260
<!-- tabs:start -->
5361

5462
### **Python3**
@@ -58,41 +66,37 @@
5866
```python
5967
class Solution:
6068
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]
7383
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]
7686
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]
7989
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]
8292
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]
8595
k += 1
8696

8797
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)
96100
return grid
97101
```
98102

@@ -102,53 +106,194 @@ class Solution:
102106

103107
```java
104108
class Solution {
109+
private int m;
110+
private int n;
111+
private int[][] grid;
112+
105113
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);
111119
}
112120
return grid;
113121
}
114122

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]);
119127
}
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]);
122130
}
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]);
125133
}
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]);
128136
}
129-
int n = t.size();
130-
k %= n;
137+
int l = nums.size();
138+
k %= l;
131139
if (k == 0) {
132140
return;
133141
}
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];
138282
}
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];
142285
}
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];
146288
}
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];
150291
}
292+
};
293+
for (let p = 0; p < Math.min(m, n) >> 1; ++p) {
294+
rotate(p, k);
151295
}
296+
return grid;
152297
}
153298
```
154299

0 commit comments

Comments
 (0)