力扣题目链接 定一个正整数 n,生成一个包含 1 到 n2 所有元素,且元素按顺时针顺序螺旋排列的正方形矩阵。
示例:
输入: 3 输出: [ [ 1, 2, 3 ], [ 8, 9, 4 ], [ 7, 6, 5 ] ]
思路:
模拟画矩阵的顺序:
- 填充上行从左到右
- 填充右列从上到下
- 填充下行从右到左
- 填充左列从下到上
画矩阵的顺序其实是按照坐标来画的:
(0,0)(0,1)(0,2)(0,3)(0,4)
(1,0)(1,1)(1,2)(1,3)(1,4)
(2,0)(2,1)(2,2)(2,3)(2,4)
(3,0)(3,1)(3,2)(3,3)(3,4)
(4,0)(4,1)(4,2)(4,3)(4,4)
1.弄清楚这个矩阵要循环几圈,loop=n/2 (每循环一次,矩阵的边长-2,也就是我们看矩阵的边长能减多少个2,即loop=n/2)
- 要注意矩阵边长的奇偶,若边长为奇数,则矩阵最中心的数要单独再填入,因为我们没有将它多算一层循环
注意:
- 画矩阵的顺序是左闭右开的,也就是每次画矩阵的边长是矩阵的边长-1
var generateMatrix = function(n){
const res = Array.from({length:n}.map((() => new Array(n))
let startx = 0,starty=0
let count=1
let mid = Math.floor(n/2)
let loop = Math.floor(n/2)
let offset = 1
leti,j
while(loop--){
i=startx,j=starty
for(j=starty;j<starty+n-offset;j++){
res[startx][j]=count++
}
for(i=startx;i<startx+n-offset;i++){
res[i][j]=count++
}
for(;j>starty;j--){
res[i][j]=count++
}
for(;i>startx;i--){
res[i][j]=count++
}
startx++
starty++
offset+=2
}
if(n%2){
res[mid][mid]=count
}
return res
}