59. 螺旋矩阵 II

135 阅读2分钟

题目

🔗题目链接:59. 螺旋矩阵 II - 力扣(LeetCode)

给你一个正整数 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

思路

使用多层循环。但要特别注意每次填充的区间,填充时建议填充左闭右开的区间。例如:n = 3,这时要这样填充[1, 2, _],末尾的空白为往下填充的起点。

过程示意:

image.png

代码

function generateMatrix(n: number): number[][] {
  // startX 是行,startY 是列
  let startX = 0,
    startY = 0;
  // x 是行, y 是列
  let x = 0,
    y = 0;

  let offset = 1;
  let loop = Math.floor(n / 2);
  let count = 1;

  const arr = new Array(n).fill(0).map(() => new Array(n).fill(0));
  // const arr = new Array(n).fill(new Array(n).fill(0));

  // 循环时,每次走的区间左闭右开
  // 从左到右 y(列)的区间 [0, n-1)
  // 从上到下 x(行)的区间 [0, n-1)
  // 从右到左 y(列)的区间 [n-1, 0)
  // 从下到上 x(行)的区间 [n-1, 0)
  while (loop) {
    // 每次循环为起点赋值
    x = startX;
    y = startY;

    // 从左到右
    while (y < n - offset) {
      arr[startX][y] = count;
      y++;
      count++;
    }

    // 从上到下
    while (x < n - offset) {
      arr[x][y] = count;
      x++;
      count++;
    }

    // 从右到左
    while (y > startY) {
      arr[x][y] = count;
      y--;
      count++;
    }

    // 从下到上
    while (x > startX) {
      arr[x][y] = count;
      x--;
      count++;
    }

    // 起始点往中心移动
    startX++;
    startY++;
    // 缩减遍历的长度
    offset++;
    // 循环次数减一
    loop--;
  }

  if (n % 2 === 1) {
    arr[startX][startY] = count;
  }

  return arr;
}

注意

创建数组应该以这样的方式

const arr = new Array(n).fill(0).map(() => new Array(n).fill(0));

下面是错误方式

const arr = new Array(n).fill(new Array(n).fill(0));

这样创建是数组相当于

const tempArr = new Array(n).fill(0);

[tempArr, tempArr, tempArr]

相当于将一个数组赋值了三次,

arr[0][0] = 1,会变成

[

[1, 0, 0],

[1, 0, 0],

[1, 0, 0]

]