跳至主要內容

59. Spiral Matrix II


59. Spiral Matrix IIopen 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. 螺旋矩阵](./0054.md)
- [885. 螺旋矩阵 III](https://leetcode.com/problems/spiral-matrix-iii)
- [2326. 螺旋矩阵 IV](https://leetcode.com/problems/spiral-matrix-iv)