题目
🔗题目链接:59. 螺旋矩阵 II - 力扣(LeetCode)
给你一个正整数 n ,生成一个包含 1 到 n2 所有元素,且元素按顺时针顺序螺旋排列的 n x n 正方形矩阵 matrix 。
示例 1:
输入: n = 3
输出: [[1,2,3],[8,9,4],[7,6,5]]
示例 2:
输入: n = 1
输出: [[1]]
提示:
1 <= n <= 20
思路
使用多层循环。但要特别注意每次填充的区间,填充时建议填充左闭右开的区间。例如:n = 3,这时要这样填充[1, 2, _],末尾的空白为往下填充的起点。
过程示意:
代码
function generateMatrix(n: number): number[][] {
// startX 是行,startY 是列
let startX = 0,
startY = 0;
// x 是行, y 是列
let x = 0,
y = 0;
let offset = 1;
let loop = Math.floor(n / 2);
let count = 1;
const arr = new Array(n).fill(0).map(() => new Array(n).fill(0));
// const arr = new Array(n).fill(new Array(n).fill(0));
// 循环时,每次走的区间左闭右开
// 从左到右 y(列)的区间 [0, n-1)
// 从上到下 x(行)的区间 [0, n-1)
// 从右到左 y(列)的区间 [n-1, 0)
// 从下到上 x(行)的区间 [n-1, 0)
while (loop) {
// 每次循环为起点赋值
x = startX;
y = startY;
// 从左到右
while (y < n - offset) {
arr[startX][y] = count;
y++;
count++;
}
// 从上到下
while (x < n - offset) {
arr[x][y] = count;
x++;
count++;
}
// 从右到左
while (y > startY) {
arr[x][y] = count;
y--;
count++;
}
// 从下到上
while (x > startX) {
arr[x][y] = count;
x--;
count++;
}
// 起始点往中心移动
startX++;
startY++;
// 缩减遍历的长度
offset++;
// 循环次数减一
loop--;
}
if (n % 2 === 1) {
arr[startX][startY] = count;
}
return arr;
}
注意
创建数组应该以这样的方式
const arr = new Array(n).fill(0).map(() => new Array(n).fill(0));
下面是错误方式
const arr = new Array(n).fill(new Array(n).fill(0));
这样创建是数组相当于
const tempArr = new Array(n).fill(0);
[tempArr, tempArr, tempArr]
相当于将一个数组赋值了三次,
arr[0][0] = 1,会变成
[
[1, 0, 0],
[1, 0, 0],
[1, 0, 0]
]