36
36
37
37
<!-- 这里可写通用的实现逻辑 -->
38
38
39
+ ** 方法一:模拟**
40
+
41
+ 直接模拟螺旋矩阵的生成过程。
42
+
43
+ 定义一个二维数组 ` ans ` ,用于存储螺旋矩阵。用 ` i ` 和 ` j ` 分别表示当前位置的行号和列号,用 ` k ` 表示当前的方向编号,` dirs ` 表示方向编号与方向的对应关系。
44
+
45
+ 从 ` 1 ` 开始,依次填入矩阵中的每个位置。每次填入一个位置后,计算下一个位置的行号和列号,如果下一个位置不在矩阵中或者已经被填过,则改变方向,再计算下一个位置的行号和列号。
46
+
47
+ 时间复杂度 $O(n^2)$,其中 $n$ 是矩阵的边长。忽略输出数组不计,空间复杂度 $O(1)$。
48
+
39
49
<!-- tabs:start -->
40
50
41
51
### ** Python3**
45
55
``` python
46
56
class Solution :
47
57
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
69
69
```
70
70
71
71
### ** Java**
@@ -75,34 +75,101 @@ class Solution:
75
75
``` java
76
76
class Solution {
77
77
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 ];
84
88
}
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;
99
91
}
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}};
100
103
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;
102
117
}
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
103
141
}
104
142
```
105
143
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
+
106
173
### ** TypeScript**
107
174
108
175
``` ts
@@ -155,39 +222,6 @@ function generateMatrix(n: number): number[][] {
155
222
}
156
223
```
157
224
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
-
191
225
### ** Rust**
192
226
193
227
``` rust
@@ -222,42 +256,6 @@ impl Solution {
222
256
}
223
257
```
224
258
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
-
261
259
### ** ...**
262
260
263
261
```
0 commit comments