一、是什么
螺旋矩阵是指在矩阵中按照螺旋顺序依次访问矩阵中的元素的一种方式。通常,螺旋矩阵是按照从外到内,由外向内逐层访问矩阵元素,形成一条螺旋的路径。这种方式通常用于对矩阵进行遍历或者按照特定顺序访问矩阵中的元素。
例如,对于一个 4x4 的矩阵:
1 2 3 4
5 6 7 8
9 10 11 12
13 14 15 16
按照螺旋顺序访问的结果为:1 2 3 4 8 12 16 15 14 13 9 5 6 7 11 10。
二、题目
三、思路
模拟顺时针画矩阵的过程:
填充上行从左到右
填充右列从上到下
填充下行从右到左
填充左列从下到上
画的是要坚持一致的左闭右开,或者左开右闭的原则,这样这一圈才能按照统一的规则画下来。
四、代码
var generateMatrix = function(n) {
let startX = startY = 0; // 起始位置
let loop = Math.floor(n/2); // 旋转圈数
let mid = Math.floor(n/2); // 中间位置
let offset = 1; // 控制每一层填充元素个数
let count = 1; // 更新填充数字
let res = new Array(n).fill(0).map(() => new Array(n).fill(0));
while (loop--) {
let row = startX, col = startY;
// 上行从左到右(左闭右开)
for (; col < n - offset; col++) {
res[row][col] = count++;
}
// 右列从上到下(左闭右开)
for (; row < n - offset; row++) {
res[row][col] = count++;
}
// 下行从右到左(左闭右开)
for (; col > startY; col--) {
res[row][col] = count++;
}
// 左列做下到上(左闭右开)
for (; row > startX; row--) {
res[row][col] = count++;
}
// 更新起始位置
startX++;
startY++;
// 更新offset
offset += 1;
}
// 如果n为奇数的话,需要单独给矩阵最中间的位置赋值
if (n % 2 === 1) {
res[mid][mid] = count;
}
return res;
};
更多矩阵例题持续更新中,关注不迷路