Skip to content

Commit 5b8e26b

Browse files
committedDec 9, 2022
feat: add solutions to lc problem: No.0059
No.0059.Spiral Matrix II
1 parent ed2cf4d commit 5b8e26b

File tree

7 files changed

+281
-312
lines changed

7 files changed

+281
-312
lines changed
 

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

+109-111
Original file line numberDiff line numberDiff line change
@@ -36,6 +36,16 @@
3636

3737
<!-- 这里可写通用的实现逻辑 -->
3838

39+
**方法一:模拟**
40+
41+
直接模拟螺旋矩阵的生成过程。
42+
43+
定义一个二维数组 `ans`,用于存储螺旋矩阵。用 `i``j` 分别表示当前位置的行号和列号,用 `k` 表示当前的方向编号,`dirs` 表示方向编号与方向的对应关系。
44+
45+
`1` 开始,依次填入矩阵中的每个位置。每次填入一个位置后,计算下一个位置的行号和列号,如果下一个位置不在矩阵中或者已经被填过,则改变方向,再计算下一个位置的行号和列号。
46+
47+
时间复杂度 $O(n^2)$,其中 $n$ 是矩阵的边长。忽略输出数组不计,空间复杂度 $O(1)$。
48+
3949
<!-- tabs:start -->
4050

4151
### **Python3**
@@ -45,27 +55,17 @@
4555
```python
4656
class Solution:
4757
def generateMatrix(self, n: int) -> List[List[int]]:
48-
res = [[0] * n for _ in range(n)]
49-
num = 1
50-
m1, m2 = 0, n - 1
51-
while m1 < m2:
52-
for j in range(m1, m2):
53-
res[m1][j] = num
54-
num += 1
55-
for i in range(m1, m2):
56-
res[i][m2] = num
57-
num += 1
58-
for j in range(m2, m1, -1):
59-
res[m2][j] = num
60-
num += 1
61-
for i in range(m2, m1, -1):
62-
res[i][m1] = num
63-
num += 1
64-
m1 += 1
65-
m2 -= 1
66-
if m1 == m2:
67-
res[m1][m1] = num
68-
return res
58+
ans = [[0] * n for _ in range(n)]
59+
dirs = ((0, 1), (1, 0), (0, -1), (-1, 0))
60+
i = j = k = 0
61+
for v in range(1, n * n + 1):
62+
ans[i][j] = v
63+
x, y = i + dirs[k][0], j + dirs[k][1]
64+
if x < 0 or y < 0 or x >= n or y >= n or ans[x][y]:
65+
k = (k + 1) % 4
66+
x, y = i + dirs[k][0], j + dirs[k][1]
67+
i, j = x, y
68+
return ans
6969
```
7070

7171
### **Java**
@@ -75,34 +75,101 @@ class Solution:
7575
```java
7676
class Solution {
7777
public int[][] generateMatrix(int n) {
78-
int[][] res = new int[n][n];
79-
int num = 1;
80-
int m1 = 0, m2 = n - 1;
81-
while (m1 < m2) {
82-
for (int j = m1; j < m2; ++j) {
83-
res[m1][j] = num++;
78+
int[][] ans = new int[n][n];
79+
int i = 0, j = 0, k = 0;
80+
int[][] dirs = {{0, 1}, {1, 0}, {0, -1}, {-1, 0}};
81+
for (int v = 1; v <= n * n; ++v) {
82+
ans[i][j] = v;
83+
int x = i + dirs[k][0], y = j + dirs[k][1];
84+
if (x < 0 || y < 0 || x >= n || y >= n || ans[x][y] > 0) {
85+
k = (k + 1) % 4;
86+
x = i + dirs[k][0];
87+
y = j + dirs[k][1];
8488
}
85-
for (int i = m1; i < m2; ++i) {
86-
res[i][m2] = num++;
87-
}
88-
for (int j = m2; j > m1; --j) {
89-
res[m2][j] = num++;
90-
}
91-
for (int i = m2; i > m1; --i) {
92-
res[i][m1] = num++;
93-
}
94-
++m1;
95-
--m2;
96-
}
97-
if (m1 == m2) {
98-
res[m1][m1] = num;
89+
i = x;
90+
j = y;
9991
}
92+
return ans;
93+
}
94+
}
95+
```
96+
97+
### **C++**
98+
99+
```cpp
100+
class Solution {
101+
public:
102+
const int dirs[4][2] = {{0, 1}, {1, 0}, {0, -1}, {-1, 0}};
100103

101-
return res;
104+
vector<vector<int>> generateMatrix(int n) {
105+
vector<vector<int>> ans(n, vector<int>(n));
106+
int i = 0, j = 0, k = 0;
107+
for (int v = 1; v <= n * n; ++v) {
108+
ans[i][j] = v;
109+
int x = i + dirs[k][0], y = j + dirs[k][1];
110+
if (x < 0 || y < 0 || x >= n || y >= n || ans[x][y]) {
111+
k = (k + 1) % 4;
112+
x = i + dirs[k][0], y = j + dirs[k][1];
113+
}
114+
i = x, j = y;
115+
}
116+
return ans;
102117
}
118+
};
119+
```
120+
121+
### **Go**
122+
123+
```go
124+
func generateMatrix(n int) [][]int {
125+
ans := make([][]int, n)
126+
for i := range ans {
127+
ans[i] = make([]int, n)
128+
}
129+
dirs := [4][2]int{{0, 1}, {1, 0}, {0, -1}, {-1, 0}}
130+
var i, j, k int
131+
for v := 1; v <= n*n; v++ {
132+
ans[i][j] = v
133+
x, y := i+dirs[k][0], j+dirs[k][1]
134+
if x < 0 || y < 0 || x >= n || y >= n || ans[x][y] > 0 {
135+
k = (k + 1) % 4
136+
x, y = i+dirs[k][0], j+dirs[k][1]
137+
}
138+
i, j = x, y
139+
}
140+
return ans
103141
}
104142
```
105143

144+
### **JavaScript**
145+
146+
```js
147+
/**
148+
* @param {number} n
149+
* @return {number[][]}
150+
*/
151+
var generateMatrix = function (n) {
152+
const ans = new Array(n).fill(0).map(() => new Array(n).fill(0));
153+
let [i, j, k] = [0, 0, 0];
154+
const dirs = [
155+
[0, 1],
156+
[1, 0],
157+
[0, -1],
158+
[-1, 0],
159+
];
160+
for (let v = 1; v <= n * n; ++v) {
161+
ans[i][j] = v;
162+
let [x, y] = [i + dirs[k][0], j + dirs[k][1]];
163+
if (x < 0 || y < 0 || x >= n || y >= n || ans[x][y] > 0) {
164+
k = (k + 1) % 4;
165+
[x, y] = [i + dirs[k][0], j + dirs[k][1]];
166+
}
167+
[i, j] = [x, y];
168+
}
169+
return ans;
170+
};
171+
```
172+
106173
### **TypeScript**
107174

108175
```ts
@@ -155,39 +222,6 @@ function generateMatrix(n: number): number[][] {
155222
}
156223
```
157224

158-
### **C++**
159-
160-
```cpp
161-
class Solution {
162-
public:
163-
vector<vector<int>> generateMatrix(int n) {
164-
vector<vector<int>> res(n, vector<int>(n, 0));
165-
int num = 1;
166-
int m1 = 0, m2 = n - 1;
167-
while (m1 < m2) {
168-
for (int j = m1; j < m2; ++j) {
169-
res[m1][j] = num++;
170-
}
171-
for (int i = m1; i < m2; ++i) {
172-
res[i][m2] = num++;
173-
}
174-
for (int j = m2; j > m1; --j) {
175-
res[m2][j] = num++;
176-
}
177-
for (int i = m2; i > m1; --i) {
178-
res[i][m1] = num++;
179-
}
180-
++m1;
181-
--m2;
182-
}
183-
if (m1 == m2) {
184-
res[m1][m1] = num;
185-
}
186-
return res;
187-
}
188-
};
189-
```
190-
191225
### **Rust**
192226

193227
```rust
@@ -222,42 +256,6 @@ impl Solution {
222256
}
223257
```
224258

225-
### **Go**
226-
227-
```go
228-
func generateMatrix(n int) [][]int {
229-
res := make([][]int, n)
230-
for i := range res {
231-
res[i] = make([]int, n)
232-
}
233-
elem := 1
234-
top, bottom, left, right := 0, n-1, 0, n-1
235-
for elem <= n*n {
236-
for i := left; i <= right; i++ {
237-
res[top][i], elem = elem, elem+1
238-
}
239-
top++
240-
for i := top; i <= bottom; i++ {
241-
res[i][right], elem = elem, elem+1
242-
}
243-
right--
244-
if top <= bottom {
245-
for i := right; i >= left; i-- {
246-
res[bottom][i], elem = elem, elem+1
247-
}
248-
bottom--
249-
}
250-
if left <= right {
251-
for i := bottom; i >= top; i-- {
252-
res[i][left], elem = elem, elem+1
253-
}
254-
left++
255-
}
256-
}
257-
return res
258-
}
259-
```
260-
261259
### **...**
262260

263261
```

0 commit comments

Comments
 (0)