Skip to content

Commit ce9edb1

Browse files
authored
feat: add solutions for lc No.1914 (#5193)
1 parent 2355646 commit ce9edb1

3 files changed

Lines changed: 176 additions & 1 deletion

File tree

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

Lines changed: 58 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -309,6 +309,64 @@ function rotateGrid(grid: number[][], k: number): number[][] {
309309
}
310310
```
311311

312+
#### Rust
313+
314+
```rust
315+
impl Solution {
316+
pub fn rotate_grid(grid: Vec<Vec<i32>>, k: i32) -> Vec<Vec<i32>> {
317+
let mut grid = grid;
318+
let m = grid.len();
319+
let n = grid[0].len();
320+
321+
let mut rotate = |p: usize, mut k: usize| {
322+
let mut nums = Vec::new();
323+
for j in p..n - p - 1 {
324+
nums.push(grid[p][j]);
325+
}
326+
for i in p..m - p - 1 {
327+
nums.push(grid[i][n - p - 1]);
328+
}
329+
for j in (p + 1..n - p).rev() {
330+
nums.push(grid[m - p - 1][j]);
331+
}
332+
for i in (p + 1..m - p).rev() {
333+
nums.push(grid[i][p]);
334+
}
335+
let l = nums.len();
336+
if l == 0 {
337+
return;
338+
}
339+
k %= l;
340+
if k == 0 {
341+
return;
342+
}
343+
for j in p..n - p - 1 {
344+
grid[p][j] = nums[k];
345+
k = (k + 1) % l;
346+
}
347+
for i in p..m - p - 1 {
348+
grid[i][n - p - 1] = nums[k];
349+
k = (k + 1) % l;
350+
}
351+
for j in (p + 1..n - p).rev() {
352+
grid[m - p - 1][j] = nums[k];
353+
k = (k + 1) % l;
354+
}
355+
for i in (p + 1..m - p).rev() {
356+
grid[i][p] = nums[k];
357+
k = (k + 1) % l;
358+
}
359+
};
360+
361+
let layers = std::cmp::min(m / 2, n / 2);
362+
for i in 0..layers {
363+
rotate(i, k as usize);
364+
}
365+
grid
366+
}
367+
}
368+
```
369+
312370
<!-- tabs:end -->
313371

314372
<!-- solution:end -->

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

Lines changed: 65 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -88,7 +88,13 @@ tags:
8888

8989
<!-- solution:start -->
9090

91-
### Solution 1
91+
### Solution 1: Layer-by-Layer Simulation
92+
93+
First, we compute the number of layers in the matrix, denoted by $p$, and then simulate the cyclic rotation layer by layer from the outside to the inside.
94+
95+
For each layer, we traverse clockwise and append the elements on the top, right, bottom, and left edges to an array $nums$ in order. Let the length of $nums$ be $l$. Next, we take $k \bmod l$. Then, starting from index $k$ in the array, we write the elements back to the matrix along the top, right, bottom, and left edges in order.
96+
97+
The time complexity is $O(m \times n)$, and the space complexity is $O(m + n)$, where $m$ and $n$ are the number of rows and columns of the matrix, respectively.
9298

9399
<!-- tabs:start -->
94100

@@ -326,6 +332,64 @@ function rotateGrid(grid: number[][], k: number): number[][] {
326332
}
327333
```
328334

335+
#### Rust
336+
337+
```rust
338+
impl Solution {
339+
pub fn rotate_grid(grid: Vec<Vec<i32>>, k: i32) -> Vec<Vec<i32>> {
340+
let mut grid = grid;
341+
let m = grid.len();
342+
let n = grid[0].len();
343+
344+
let mut rotate = |p: usize, mut k: usize| {
345+
let mut nums = Vec::new();
346+
for j in p..n - p - 1 {
347+
nums.push(grid[p][j]);
348+
}
349+
for i in p..m - p - 1 {
350+
nums.push(grid[i][n - p - 1]);
351+
}
352+
for j in (p + 1..n - p).rev() {
353+
nums.push(grid[m - p - 1][j]);
354+
}
355+
for i in (p + 1..m - p).rev() {
356+
nums.push(grid[i][p]);
357+
}
358+
let l = nums.len();
359+
if l == 0 {
360+
return;
361+
}
362+
k %= l;
363+
if k == 0 {
364+
return;
365+
}
366+
for j in p..n - p - 1 {
367+
grid[p][j] = nums[k];
368+
k = (k + 1) % l;
369+
}
370+
for i in p..m - p - 1 {
371+
grid[i][n - p - 1] = nums[k];
372+
k = (k + 1) % l;
373+
}
374+
for j in (p + 1..n - p).rev() {
375+
grid[m - p - 1][j] = nums[k];
376+
k = (k + 1) % l;
377+
}
378+
for i in (p + 1..m - p).rev() {
379+
grid[i][p] = nums[k];
380+
k = (k + 1) % l;
381+
}
382+
};
383+
384+
let layers = std::cmp::min(m / 2, n / 2);
385+
for i in 0..layers {
386+
rotate(i, k as usize);
387+
}
388+
grid
389+
}
390+
}
391+
```
392+
329393
<!-- tabs:end -->
330394

331395
<!-- solution:end -->
Lines changed: 53 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,53 @@
1+
impl Solution {
2+
pub fn rotate_grid(grid: Vec<Vec<i32>>, k: i32) -> Vec<Vec<i32>> {
3+
let mut grid = grid;
4+
let m = grid.len();
5+
let n = grid[0].len();
6+
7+
let mut rotate = |p: usize, mut k: usize| {
8+
let mut nums = Vec::new();
9+
for j in p..n - p - 1 {
10+
nums.push(grid[p][j]);
11+
}
12+
for i in p..m - p - 1 {
13+
nums.push(grid[i][n - p - 1]);
14+
}
15+
for j in (p + 1..n - p).rev() {
16+
nums.push(grid[m - p - 1][j]);
17+
}
18+
for i in (p + 1..m - p).rev() {
19+
nums.push(grid[i][p]);
20+
}
21+
let l = nums.len();
22+
if l == 0 {
23+
return;
24+
}
25+
k %= l;
26+
if k == 0 {
27+
return;
28+
}
29+
for j in p..n - p - 1 {
30+
grid[p][j] = nums[k];
31+
k = (k + 1) % l;
32+
}
33+
for i in p..m - p - 1 {
34+
grid[i][n - p - 1] = nums[k];
35+
k = (k + 1) % l;
36+
}
37+
for j in (p + 1..n - p).rev() {
38+
grid[m - p - 1][j] = nums[k];
39+
k = (k + 1) % l;
40+
}
41+
for i in (p + 1..m - p).rev() {
42+
grid[i][p] = nums[k];
43+
k = (k + 1) % l;
44+
}
45+
};
46+
47+
let layers = std::cmp::min(m / 2, n / 2);
48+
for i in 0..layers {
49+
rotate(i, k as usize);
50+
}
51+
grid
52+
}
53+
}

0 commit comments

Comments
 (0)