Skip to content

Commit 2bfa7a9

Browse files
authoredFeb 7, 2025··
feat: add solutions to lc problem: No.0059 (#4037)
No.0059.Spiral Matrix II
1 parent 3ca7f17 commit 2bfa7a9

File tree

10 files changed

+155
-335
lines changed

10 files changed

+155
-335
lines changed
 

‎solution/0000-0099/0059.Spiral Matrix II/README.md

+52-117
Original file line numberDiff line numberDiff line change
@@ -52,13 +52,13 @@ tags:
5252

5353
### 方法一:模拟
5454

55-
直接模拟螺旋矩阵的生成过程
55+
我们可以直接模拟螺旋矩阵的生成过程
5656

57-
定义一个二维数组 `ans`,用于存储螺旋矩阵。用 `i``j` 分别表示当前位置的行号和列号,用 `k` 表示当前的方向编号,`dirs` 表示方向编号与方向的对应关系。
57+
定义一个二维数组 $\textit{ans}$,用于存储螺旋矩阵。用 $i$$j$ 分别表示当前位置的行号和列号,用 $k$ 表示当前的方向编号,$\textit{dirs}$ 表示方向编号与方向的对应关系。
5858

59-
`1` 开始,依次填入矩阵中的每个位置。每次填入一个位置后,计算下一个位置的行号和列号,如果下一个位置不在矩阵中或者已经被填过,则改变方向,再计算下一个位置的行号和列号。
59+
$1$ 开始,依次填入矩阵中的每个位置。每次填入一个位置后,计算下一个位置的行号和列号,如果下一个位置不在矩阵中或者已经被填过,则改变方向,再计算下一个位置的行号和列号。
6060

61-
时间复杂度 $O(n^2)$,其中 $n$ 是矩阵的边长。忽略输出数组不计,空间复杂度 $O(1)$。
61+
时间复杂度 $O(n^2)$,其中 $n$ 是矩阵的边长。忽略答案数组的空间消耗,空间复杂度 $O(1)$。
6262

6363
<!-- tabs:start -->
6464

@@ -68,15 +68,14 @@ tags:
6868
class Solution:
6969
def generateMatrix(self, n: int) -> List[List[int]]:
7070
ans = [[0] * n for _ in range(n)]
71-
dirs = ((0, 1), (1, 0), (0, -1), (-1, 0))
71+
dirs = (0, 1, 0, -1, 0)
7272
i = j = k = 0
7373
for v in range(1, n * n + 1):
7474
ans[i][j] = v
75-
x, y = i + dirs[k][0], j + dirs[k][1]
76-
if x < 0 or y < 0 or x >= n or y >= n or ans[x][y]:
75+
x, y = i + dirs[k], j + dirs[k + 1]
76+
if x < 0 or x >= n or y < 0 or y >= n or ans[x][y]:
7777
k = (k + 1) % 4
78-
x, y = i + dirs[k][0], j + dirs[k][1]
79-
i, j = x, y
78+
i, j = i + dirs[k], j + dirs[k + 1]
8079
return ans
8180
```
8281

@@ -86,18 +85,16 @@ class Solution:
8685
class Solution {
8786
public int[][] generateMatrix(int n) {
8887
int[][] ans = new int[n][n];
88+
final int[] dirs = {0, 1, 0, -1, 0};
8989
int i = 0, j = 0, k = 0;
90-
int[][] dirs = {{0, 1}, {1, 0}, {0, -1}, {-1, 0}};
9190
for (int v = 1; v <= n * n; ++v) {
9291
ans[i][j] = v;
93-
int x = i + dirs[k][0], y = j + dirs[k][1];
94-
if (x < 0 || y < 0 || x >= n || y >= n || ans[x][y] > 0) {
92+
int x = i + dirs[k], y = j + dirs[k + 1];
93+
if (x < 0 || x >= n || y < 0 || y >= n || ans[x][y] != 0) {
9594
k = (k + 1) % 4;
96-
x = i + dirs[k][0];
97-
y = j + dirs[k][1];
9895
}
99-
i = x;
100-
j = y;
96+
i += dirs[k];
97+
j += dirs[k + 1];
10198
}
10299
return ans;
103100
}
@@ -109,19 +106,18 @@ class Solution {
109106
```cpp
110107
class Solution {
111108
public:
112-
const int dirs[4][2] = {{0, 1}, {1, 0}, {0, -1}, {-1, 0}};
113-
114109
vector<vector<int>> generateMatrix(int n) {
115-
vector<vector<int>> ans(n, vector<int>(n));
110+
vector<vector<int>> ans(n, vector<int>(n, 0));
111+
const int dirs[5] = {0, 1, 0, -1, 0};
116112
int i = 0, j = 0, k = 0;
117113
for (int v = 1; v <= n * n; ++v) {
118114
ans[i][j] = v;
119-
int x = i + dirs[k][0], y = j + dirs[k][1];
120-
if (x < 0 || y < 0 || x >= n || y >= n || ans[x][y]) {
115+
int x = i + dirs[k], y = j + dirs[k + 1];
116+
if (x < 0 || x >= n || y < 0 || y >= n || ans[x][y] != 0) {
121117
k = (k + 1) % 4;
122-
x = i + dirs[k][0], y = j + dirs[k][1];
123118
}
124-
i = x, j = y;
119+
i += dirs[k];
120+
j += dirs[k + 1];
125121
}
126122
return ans;
127123
}
@@ -136,16 +132,16 @@ func generateMatrix(n int) [][]int {
136132
for i := range ans {
137133
ans[i] = make([]int, n)
138134
}
139-
dirs := [4][2]int{{0, 1}, {1, 0}, {0, -1}, {-1, 0}}
140-
var i, j, k int
135+
dirs := [5]int{0, 1, 0, -1, 0}
136+
i, j, k := 0, 0, 0
141137
for v := 1; v <= n*n; v++ {
142138
ans[i][j] = v
143-
x, y := i+dirs[k][0], j+dirs[k][1]
144-
if x < 0 || y < 0 || x >= n || y >= n || ans[x][y] > 0 {
139+
x, y := i+dirs[k], j+dirs[k+1]
140+
if x < 0 || x >= n || y < 0 || y >= n || ans[x][y] != 0 {
145141
k = (k + 1) % 4
146-
x, y = i+dirs[k][0], j+dirs[k][1]
147142
}
148-
i, j = x, y
143+
i += dirs[k]
144+
j += dirs[k+1]
149145
}
150146
return ans
151147
}
@@ -155,24 +151,17 @@ func generateMatrix(n int) [][]int {
155151

156152
```ts
157153
function generateMatrix(n: number): number[][] {
158-
let ans = Array.from({ length: n }, v => new Array(n));
159-
let dir = [
160-
[0, 1],
161-
[1, 0],
162-
[0, -1],
163-
[-1, 0],
164-
];
165-
let i = 0,
166-
j = 0;
167-
for (let cnt = 1, k = 0; cnt <= n * n; cnt++) {
168-
ans[i][j] = cnt;
169-
let x = i + dir[k][0],
170-
y = j + dir[k][1];
171-
if (x < 0 || x == n || y < 0 || y == n || ans[x][y]) {
154+
const ans: number[][] = Array.from({ length: n }, () => Array(n).fill(0));
155+
const dirs = [0, 1, 0, -1, 0];
156+
let [i, j, k] = [0, 0, 0];
157+
for (let v = 1; v <= n * n; v++) {
158+
ans[i][j] = v;
159+
const [x, y] = [i + dirs[k], j + dirs[k + 1]];
160+
if (x < 0 || x >= n || y < 0 || y >= n || ans[x][y] !== 0) {
172161
k = (k + 1) % 4;
173-
(x = i + dir[k][0]), (y = j + dir[k][1]);
174162
}
175-
(i = x), (j = y);
163+
i += dirs[k];
164+
j += dirs[k + 1];
176165
}
177166
return ans;
178167
}
@@ -183,31 +172,19 @@ function generateMatrix(n: number): number[][] {
183172
```rust
184173
impl Solution {
185174
pub fn generate_matrix(n: i32) -> Vec<Vec<i32>> {
186-
let n = n as usize;
187-
let mut res = vec![vec![0; n]; n];
188-
let mut num = 1;
189-
for i in 0..n / 2 {
190-
for j in i..n - i - 1 {
191-
res[i][j] = num;
192-
num += 1;
193-
}
194-
for j in i..n - i - 1 {
195-
res[j][n - i - 1] = num;
196-
num += 1;
197-
}
198-
for j in i..n - i - 1 {
199-
res[n - i - 1][n - j - 1] = num;
200-
num += 1;
201-
}
202-
for j in i..n - i - 1 {
203-
res[n - j - 1][i] = num;
204-
num += 1;
175+
let mut ans = vec![vec![0; n as usize]; n as usize];
176+
let dirs = [0, 1, 0, -1, 0];
177+
let (mut i, mut j, mut k) = (0, 0, 0);
178+
for v in 1..=n * n {
179+
ans[i as usize][j as usize] = v;
180+
let (x, y) = (i + dirs[k], j + dirs[k + 1]);
181+
if x < 0 || x >= n || y < 0 || y >= n || ans[x as usize][y as usize] != 0 {
182+
k = (k + 1) % 4;
205183
}
184+
i += dirs[k];
185+
j += dirs[k + 1];
206186
}
207-
if n % 2 == 1 {
208-
res[n >> 1][n >> 1] = num;
209-
}
210-
res
187+
ans
211188
}
212189
}
213190
```
@@ -220,22 +197,17 @@ impl Solution {
220197
* @return {number[][]}
221198
*/
222199
var generateMatrix = function (n) {
223-
const ans = new Array(n).fill(0).map(() => new Array(n).fill(0));
200+
const ans = Array.from({ length: n }, () => Array(n).fill(0));
201+
const dirs = [0, 1, 0, -1, 0];
224202
let [i, j, k] = [0, 0, 0];
225-
const dirs = [
226-
[0, 1],
227-
[1, 0],
228-
[0, -1],
229-
[-1, 0],
230-
];
231-
for (let v = 1; v <= n * n; ++v) {
203+
for (let v = 1; v <= n * n; v++) {
232204
ans[i][j] = v;
233-
let [x, y] = [i + dirs[k][0], j + dirs[k][1]];
234-
if (x < 0 || y < 0 || x >= n || y >= n || ans[x][y] > 0) {
205+
const [x, y] = [i + dirs[k], j + dirs[k + 1]];
206+
if (x < 0 || x >= n || y < 0 || y >= n || ans[x][y] !== 0) {
235207
k = (k + 1) % 4;
236-
[x, y] = [i + dirs[k][0], j + dirs[k][1]];
237208
}
238-
[i, j] = [x, y];
209+
i += dirs[k];
210+
j += dirs[k + 1];
239211
}
240212
return ans;
241213
};
@@ -245,41 +217,4 @@ var generateMatrix = function (n) {
245217

246218
<!-- solution:end -->
247219

248-
<!-- solution:start -->
249-
250-
### 方法二
251-
252-
<!-- tabs:start -->
253-
254-
#### TypeScript
255-
256-
```ts
257-
function generateMatrix(n: number): number[][] {
258-
const res = new Array(n).fill(0).map(() => new Array(n).fill(0));
259-
let num = 1;
260-
for (let i = 0; i < Math.floor(n / 2); i++) {
261-
for (let j = i; j < n - i - 1; j++) {
262-
res[i][j] = num++;
263-
}
264-
for (let j = i; j < n - i - 1; j++) {
265-
res[j][n - i - 1] = num++;
266-
}
267-
for (let j = i; j < n - i - 1; j++) {
268-
res[n - i - 1][n - j - 1] = num++;
269-
}
270-
for (let j = i; j < n - i - 1; j++) {
271-
res[n - j - 1][i] = num++;
272-
}
273-
}
274-
if (n % 2 === 1) {
275-
res[n >> 1][n >> 1] = num;
276-
}
277-
return res;
278-
}
279-
```
280-
281-
<!-- tabs:end -->
282-
283-
<!-- solution:end -->
284-
285220
<!-- problem:end -->

0 commit comments

Comments
 (0)
Please sign in to comment.