给定一个正整数 n,生成一个包含 1 到 n2 所有元素,且元素按顺时针顺序螺旋排列的正方形矩阵。
示例:
输入: 3
输出:
[
[ 1, 2, 3 ],
[ 8, 9, 4 ],
[ 7, 6, 5 ]
]
解法如下:
/**
* @param {number} n
* @return {number[][]}
*/
var generateMatrix = function(n) {
if (!n) return []
const res = []
for (let i = 0; i < n; i++) {
res[i] = []
for (let j = 0; j < n; j++) {
res[i][j] = 0
}
}
// 向左前进:'left',向右前进:'right',向上前进:'top', 向下前进:'down'
let direction = 'right'
let x = 0, y = 0
const visitedArr = []
const col = n
const row = n
for (let i = 0; i < row; i++) {
visitedArr[i] = []
for (let j = 0; j < col; j++) {
visitedArr[i][j] = false
}
}
for (let index = 1; index <= n ** 2;) {
switch (direction) {
case 'right':
for (let k = x; k < col; k++) {
if (!visitedArr[y][k]) {
res[y][k] = index++
visitedArr[y][k] = true
x = k
if (x === col - 1) direction = 'down'
} else {
direction = 'down'
}
}
break;
case 'down':
for (let k = y + 1; k < row; k++) {
if (!visitedArr[k][x]) {
res[k][x] = index++
visitedArr[k][x] = true
y = k
if (y === row - 1) direction = 'left'
} else {
direction = 'left'
}
}
break;
case 'left':
for (let k = x - 1; k >= 0; k--) {
if (!visitedArr[y][k]) {
res[y][k] = index++
visitedArr[y][k] = true
x = k
if (x === 0) direction = 'top'
} else {
direction = 'top'
}
}
break;
case 'top':
for (let k = y - 1; k >= 0; k--) {
if (!visitedArr[k][x]) {
res[k][x] = index++
visitedArr[k][x] = true
y = k
} else {
direction = 'right'
}
}
break;
default:
break;
}
}
return res
};
如有更好解法,欢迎留言探讨。