跳至主要內容

59. 螺旋矩阵 II


59. 螺旋矩阵 IIopen in new window

🟠   🔖  数组 矩阵 模拟  🔗 力扣open in new window LeetCodeopen in new window

题目

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螺旋矩阵open in new window[✓]数组 矩阵 模拟
885螺旋矩阵 IIIopen in new window数组 矩阵 模拟
2326螺旋矩阵 IVopen in new window数组 链表 矩阵 1+