@@ -52,13 +52,13 @@ tags:
52
52
53
53
### 方法一:模拟
54
54
55
- 直接模拟螺旋矩阵的生成过程 。
55
+ 我们可以直接模拟螺旋矩阵的生成过程 。
56
56
57
- 定义一个二维数组 ` ans ` ,用于存储螺旋矩阵。用 ` i ` 和 ` j ` 分别表示当前位置的行号和列号,用 ` k ` 表示当前的方向编号,` dirs ` 表示方向编号与方向的对应关系。
57
+ 定义一个二维数组 $\textit{ ans}$ ,用于存储螺旋矩阵。用 $i$ 和 $j$ 分别表示当前位置的行号和列号,用 $k$ 表示当前的方向编号,$\textit{ dirs}$ 表示方向编号与方向的对应关系。
58
58
59
- 从 ` 1 ` 开始,依次填入矩阵中的每个位置。每次填入一个位置后,计算下一个位置的行号和列号,如果下一个位置不在矩阵中或者已经被填过,则改变方向,再计算下一个位置的行号和列号。
59
+ 从 $1$ 开始,依次填入矩阵中的每个位置。每次填入一个位置后,计算下一个位置的行号和列号,如果下一个位置不在矩阵中或者已经被填过,则改变方向,再计算下一个位置的行号和列号。
60
60
61
- 时间复杂度 $O(n^2)$,其中 $n$ 是矩阵的边长。忽略输出数组不计 ,空间复杂度 $O(1)$。
61
+ 时间复杂度 $O(n^2)$,其中 $n$ 是矩阵的边长。忽略答案数组的空间消耗 ,空间复杂度 $O(1)$。
62
62
63
63
<!-- tabs:start -->
64
64
@@ -68,15 +68,14 @@ tags:
68
68
class Solution :
69
69
def generateMatrix (self , n : int ) -> List[List[int ]]:
70
70
ans = [[0 ] * n for _ in range (n)]
71
- dirs = (( 0 , 1 ), ( 1 , 0 ), ( 0 , - 1 ), ( - 1 , 0 ) )
71
+ dirs = (0 , 1 , 0 , - 1 , 0 )
72
72
i = j = k = 0
73
73
for v in range (1 , n * n + 1 ):
74
74
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]:
77
77
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 ]
80
79
return ans
81
80
```
82
81
@@ -86,18 +85,16 @@ class Solution:
86
85
class Solution {
87
86
public int [][] generateMatrix (int n ) {
88
87
int [][] ans = new int [n][n];
88
+ final int [] dirs = {0 , 1 , 0 , - 1 , 0 };
89
89
int i = 0 , j = 0 , k = 0 ;
90
- int [][] dirs = {{0 , 1 }, {1 , 0 }, {0 , - 1 }, {- 1 , 0 }};
91
90
for (int v = 1 ; v <= n * n; ++ v) {
92
91
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 ) {
95
94
k = (k + 1 ) % 4 ;
96
- x = i + dirs[k][0 ];
97
- y = j + dirs[k][1 ];
98
95
}
99
- i = x ;
100
- j = y ;
96
+ i += dirs[k] ;
97
+ j += dirs[k + 1 ] ;
101
98
}
102
99
return ans;
103
100
}
@@ -109,19 +106,18 @@ class Solution {
109
106
``` cpp
110
107
class Solution {
111
108
public:
112
- const int dirs[ 4] [ 2 ] = {{0, 1}, {1, 0}, {0, -1}, {-1, 0}};
113
-
114
109
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};
116
112
int i = 0, j = 0, k = 0;
117
113
for (int v = 1; v <= n * n; ++v) {
118
114
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 ) {
121
117
k = (k + 1) % 4;
122
- x = i + dirs[k][0], y = j + dirs[k][1];
123
118
}
124
- i = x, j = y;
119
+ i += dirs[ k] ;
120
+ j += dirs[ k + 1] ;
125
121
}
126
122
return ans;
127
123
}
@@ -136,16 +132,16 @@ func generateMatrix(n int) [][]int {
136
132
for i := range ans {
137
133
ans[i] = make([]int, n)
138
134
}
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
141
137
for v := 1; v <= n*n; v++ {
142
138
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 {
145
141
k = (k + 1) % 4
146
- x, y = i+dirs[k][0 ], j+dirs[k][1 ]
147
142
}
148
- i, j = x, y
143
+ i += dirs[k]
144
+ j += dirs[k+1]
149
145
}
150
146
return ans
151
147
}
@@ -155,24 +151,17 @@ func generateMatrix(n int) [][]int {
155
151
156
152
``` ts
157
153
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 ) {
172
161
k = (k + 1 ) % 4 ;
173
- (x = i + dir [k ][0 ]), (y = j + dir [k ][1 ]);
174
162
}
175
- (i = x ), (j = y );
163
+ i += dirs [k ];
164
+ j += dirs [k + 1 ];
176
165
}
177
166
return ans ;
178
167
}
@@ -183,31 +172,19 @@ function generateMatrix(n: number): number[][] {
183
172
``` rust
184
173
impl Solution {
185
174
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 ;
205
183
}
184
+ i += dirs [k ];
185
+ j += dirs [k + 1 ];
206
186
}
207
- if n % 2 == 1 {
208
- res [n >> 1 ][n >> 1 ] = num ;
209
- }
210
- res
187
+ ans
211
188
}
212
189
}
213
190
```
@@ -220,22 +197,17 @@ impl Solution {
220
197
* @return {number[][]}
221
198
*/
222
199
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 ];
224
202
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++ ) {
232
204
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 ) {
235
207
k = (k + 1 ) % 4 ;
236
- [x, y] = [i + dirs[k][0 ], j + dirs[k][1 ]];
237
208
}
238
- [i, j] = [x, y];
209
+ i += dirs[k];
210
+ j += dirs[k + 1 ];
239
211
}
240
212
return ans;
241
213
};
@@ -245,41 +217,4 @@ var generateMatrix = function (n) {
245
217
246
218
<!-- solution: end -->
247
219
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
-
285
220
<!-- problem: end -->
0 commit comments