标签:数组 中等
# 题目
给你一个正整数 n ,生成一个包含 1 到 n2 所有元素,且元素按顺时针顺序螺旋排列的 n x n 正方形矩阵 matrix 。
示例 1:
输入:n = 3
输出:[[1,2,3],[8,9,4],[7,6,5]]
1
2
2
示例 2:
输入:n = 1
输出:[[1]]
1
2
2
提示:
- 1 <= n <= 20
# 解析
已经好久没有刷题了,这道题第一次做的时候有点思路,但是想的不太正确,没做出来,后面看了下题解纠正了思路,没有继续尝试了...今天第二次做吸取上次的教训,一步一步按题目逻辑来就做出来了,做这种题最好的方式就是模拟实现,再修正细节。
/**
* @param {number} n
* @return {number[][]}
*/
var generateMatrix = function(n) {
if (n === 1) return [[1]]
// 初始化一个二维数组
const arr = Array(n).fill(0).map(() => Array(n).fill(0))
// 每个方向的长度边界
let border = n - 1
// 当前x和y轴的位置
let x = 0, y = 0
// 当前元素
let cur = 1
while (border > 0) {
// 向右
for (let i=0; i<border; i++) {
arr[x][y] = cur
cur++
y++
}
// 向下
for (let i=0; i<border; i++) {
arr[x][y] = cur
cur++
x++
}
// 向左
for (let i=0; i<border; i++) {
arr[x][y] = cur
cur++
y--
}
// 向上
for (let i=0; i<border; i++) {
arr[x][y] = cur
cur++
x--
}
x++
y++
border = border - 2
if (border === 0) {
arr[x][y] = cur
break
}
}
return arr
};
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49