给你一个正整数 n ,生成一个包含 1n 所有元素,且元素按顺时针顺序螺旋排列的 n x n 正方形矩阵 matrix

示例一
image.png

  1. 输入:n = 3
  2. 输出:[[1,2,3],[8,9,4],[7,6,5]]

示例 2

输入:n = 1
输出:[[1]]

提示

  • 1 <= n <= 20

    题解

    生成一个 n×n 空矩阵 mat,随后模拟整个向内环绕的填入过程:

  • 定义当前左右上下边界l,r,t,b,初始值num=1,终止时tar=n*n

  • num <= tar 时,始终按照从左到右,从上到下,从右到左,从下到上填入顺序循环,每次填入后:
    • 执行 num += 1:得到下一个需要填入的数字;
    • 更新边界:例如从左到右填完后,上边界 t += 1,相当于上边界向内缩 1。
  • 使用num <= tar而不是l < r || t < b作为迭代条件,是为了解决当n为奇数时,矩阵中心数字无法在迭代过程中被填充的问题。

image.png

Python

class Solution:
    def generateMatrix(self, n: int) -> [[int]]:
        l, r, t, b = 0, n - 1, 0, n - 1
        mat = [[0 for _ in range(n)] for _ in range(n)]
        num, tar = 1, n * n
        while num <= tar:
            # left -> right
            for i in range(l, r + 1): # left to right
                mat[t][i] = num
                num += 1
            t += 1
            # top -> bottom
            for i in range(t, b + 1): # top to bottom
                mat[i][r] = num
                num += 1
            r -= 1
            # right -> left
            for i in range(r, l - 1, -1): # right to left
                mat[b][i] = num
                num += 1
            b -= 1
            # right -> top
            for i in range(b, t - 1, -1): # bottom to top
                mat[i][l] = num
                num += 1
            l += 1
        return mat

JavaScript

/**
 * @param {number} n
 * @return {number[][]}
 */
var generateMatrix = function(n) {
    let l = 0
    let r = n-1
    let t = 0
    let b = n-1
    let num=1
    let target = n*n
    let mat = new Array(n).fill(0).map(_ => new Array(n).fill(0))
    while (num <= target){
        for(let i=l;i<r+1;i++){
            mat[t][i] = num
            num ++
        }
        t++
        for(let i=t;i<b+1;i++){
            mat[i][r] = num
            num++
        }
        r--
        for(let i=r;i>l-1;i--){
            mat[b][i] = num
            num++
        }
        b--
        for(let i=b;i>t-1;i--){
            mat[i][l] = num
            num++
        }
        l++
    }
    return mat

};

复杂度分析

  • 时间复杂度:🥈 59. 螺旋矩阵 II - 图3,其中 n 是给定的正整数。矩阵的大小是 🥈 59. 螺旋矩阵 II - 图4,需要填入矩阵中的每个元素。

  • 空间复杂度:🥈 59. 螺旋矩阵 II - 图5。除了返回的矩阵以外,空间复杂度是常数。