给你一个正整数 n
,生成一个包含 1
到 n
所有元素,且元素按顺时针顺序螺旋排列的 n x n
正方形矩阵 matrix
。
示例一:
输入:n = 3
输出:[[1,2,3],[8,9,4],[7,6,5]]
示例 2:
输入:n = 1
输出:[[1]]
提示:
-
题解
生成一个
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为奇数时,矩阵中心数字无法在迭代过程中被填充的问题。
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
};
复杂度分析
时间复杂度:
,其中 n 是给定的正整数。矩阵的大小是
,需要填入矩阵中的每个元素。
空间复杂度:
。除了返回的矩阵以外,空间复杂度是常数。