题目
题目来源:力扣(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 * n 的矩阵,确定矩阵的四个边界,它是初始遍历的边界。
2、模拟顺时针画矩阵的过程,按照上、右、下、左的顺序填充:
(1)填充上行从左到右
(2)填充右列从上到下
(3)填充下行从右到左
(4)填充左列从下到上。
3、每遍历一个格子,填上对应的 count,count自增。
4、每次填充完一圈后,更新起点位置
5、最后判断 n 是否是奇数,若是奇数,中间格子需要单独填充
/*** @param {number} n* @return {number[][]}*/var generateMatrix = function (n) {// new Array(n).fill(new Array(n))// 使用fill --> 填充的是同一个数组地址const res = Array.from({ length: n }).map(() => new Array(n));// 填充一圈为一个循环let loop = n >> 1, // 循环次数i = 0, // 当前是第几次循环count = 1, // 要填充的数字startX = startY = 0; // 每次循环的起始位置while (++i <= loop) {// 定义行列初始位置let row = startX, column = startY;// [ startY, n - i) 填充左到右// 上:行不动,列增加while (column < n - i) {res[row][column++] = count++;}// [ startX, n - i) 填充上到下// 右:列不动,行增加while (row < n - i) {res[row++][column] = count++;}// [n - i , startY) 填充右到左// 下:行不动,列减少while (column > startY) {res[row][column--] = count++;}// [n - i , startX) 填充下到上// 左:列不动,行减少while (row > startX) {res[row--][column] = count++;}// 循环一次后,更新循环的起点位置startX = ++startY;}// 若果 n 是奇数,则中间的各自需要单独填充if (n & 1) {res[startX][startY] = count;}return res;};
