leetcode—59.螺旋矩阵 II
关键字:二维数组 循环设计
给你一个正整数 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
https://leetcode-cn.com/problems/spiral-matrix-ii/
解法
这道题遇到了一个问题是JavaScript生成矩阵的一个方法,
const matrixH = Array.from({length: n}).map(()=>new Array(n));
Array.from()
用于生成一个数组
map()
方法将数组中的元素通过箭头函数进行一个映射。
详细见 箭头函数
Array.map()
map 方法会给原数组中的每个元素都按顺序调用一次 callback 函数。callback 每次执行后的返回值(包括undefined)组合起来形成一个新数组。 callback 函数只会在有值的索引上被调用;那些从来没被赋过值或者使用 delete删除的索引则不会被调用。
const materials = [
'Hydrogen',
'Helium',
'Lithium',
'Beryllium'
];
// 这里aa表示参数名
console.log(materials.map(aa => aa.length));
// expected output: Array [8, 6, 7, 9]
思路
这道题的循环思路是要确定好循环过程中每个边的范围,
如上图所示,每条边走两格(即n-1格),走四次刚好遍历了周围一圈的边界。
同时针对n的奇偶性,判断出需要进行的循环层数( 即n地板除2 )
let loop = 0;
while (loop<(n>>1)){
...
}
例,n等于3时,只循环一层;n等于4时,循环两层
对于n为奇数时,需要在循环结束后,对中心的一个格子进行补充赋值:
// n为奇数时,需要补充最中间区域的值
if (n & 1) {
matrixH[i][j] = countnum;
}
随着循环,每一层对应边的长度会发生变化,随层数增加而减少
for (j; j<n-loop-1; j++) {
...
}
并且走过一层后,坐标点i,j会回到这一层循环的出发点,为了进入下一层循环,每层结束后要进行更新。
loop++;
i++;
j++;
比如n为4时,分为两层,第一层结束坐标为(0, 0); 第二层开始坐标为(1, 1)。
代码:
var generateMatrix = function(n) {
// 生成指定大小的矩阵
const matrixH = Array.from({length: n}).map(()=>new Array(n));
let loop = 0,
i = 0, j = 0,
countnum = 1;
// 循环次数由n//2决定
while (loop<(n>>1)) {
// 上面一条边
for (j; j<n-loop-1; j++) {
matrixH[i][j] = countnum;
countnum++;
}
// 右面一条边
for (i; i<n-loop-1; i++) {
matrixH[i][j] = countnum;
countnum++;
}
// 下面一条边
for (j; j>loop; j--) {
matrixH[i][j] = countnum;
countnum++;
}
// 左面一条边
for (i; i>loop; i--) {
matrixH[i][j] = countnum;
countnum++;
}
// 更新进入内层的下一次循环
loop++;
i++;
j++;
}
// n为奇数时,需要补充最中间区域的值
if (n & 1) {
matrixH[i][j] = countnum;
}
return matrixH;
};