59. 螺旋矩阵 II
59. 螺旋矩阵 II
题目
Given a positive integer n
, generate an n x n
matrix
filled with elements from 1
to n2
in spiral order.
Example 1:
Input: n = 3
Output: [[1,2,3],[8,9,4],[7,6,5]]
Example 2:
Input: n = 1
Output: [[1]]
Constraints:
1 <= n <= 20
题目大意
给定一个正整数 n,生成一个包含 1 到 n^2 所有元素,且元素按顺时针顺序螺旋排列的正方形矩阵。
解题思路
- 给出一个数组 n,要求输出一个 n * n 的二维数组,里面元素是 1 - n*n,且数组排列顺序是螺旋排列的;
- 这一题是第 54 题的加强版,没有需要注意的特殊情况,直接模拟即可;
- 用四个指针控制每次上、下、左、右的边,然后按照逆时针的顺序从边界上依次访问元素;
- 当访问完当前边界之后,要更新一下边界位置,缩小范围,方便下一轮进行访问;
- 注意初始化
res
时不能直接new Array(n).fill([])
,因为 JS 中将数组作为参数时,传递的是引用,而不是value
;
代码
/**
* @param {number} n
* @return {number[][]}
*/
var generateMatrix = function (n) {
let count = 0;
let left = 0;
let right = n - 1;
let top = 0;
let bottom = n - 1;
let res = new Array(n).fill(0).map(() => new Array(n));
while (count < n * n) {
// 在上边界向右扫描
for (let i = left; i <= right; i++) {
count++;
res[top][i] = count;
}
// 缩小上边界
top++;
// 在右边界向下扫描
for (let i = top; i <= bottom; i++) {
count++;
res[i][right] = count;
}
// 缩小右边界
right--;
// 在下边界向左扫描
for (let i = right; i >= left; i--) {
count++;
res[bottom][i] = count;
}
// 缩小下边界
bottom--;
// 在左边界向上扫描
for (let i = bottom; i >= top; i--) {
count++;
res[i][left] = count;
}
// 缩小左边界
left++;
}
return res;
};
相关题目
题号 | 标题 | 题解 | 标签 | 难度 |
---|---|---|---|---|
54 | 螺旋矩阵 | [✓] | 数组 矩阵 模拟 | |
885 | 螺旋矩阵 III | 数组 矩阵 模拟 | ||
2326 | 螺旋矩阵 IV | 数组 链表 矩阵 1+ |