给定一个正整数 n,生成一个包含 1 到 n2 所有元素,且元素按顺时针顺序螺旋排列的正方形矩阵。
示例:
输入: 3
输出:
[
[ 1, 2, 3 ],
[ 8, 9, 4 ],
[ 7, 6, 5 ]
]
class Solution:
def generateMatrix(self, n: int) -> List[List[int]]:
list0 = [j for j in range(1,n**2 + 1)] # 生成长列表
x = y = 0
dx = [0,1,0,-1] # 方向坐标
dy = [1,0,-1,0]
di = 0
visited = set() # 初始化集合,用于记录已走过坐标
list1 = [[None for k in range(n)] for k in range(n)] # 生成空矩阵
for i in range(n**2):
list1[x][y] = list0[i]
visited.add((x,y))
nx,ny = x + dx[di],y+dy[di] # 记录下一步操作
if 0<=nx<n and 0<=ny<n and (nx,ny) not in visited: # 判断是否越界,未曾走过的路
x,y = nx,ny
else:
di = (di+1)%4
x,y= x+dx[di],y+dy[di]
return list1
#测试示例
data = 3
x = Solution()
prt = x.generateMatrix(data)
print(prt)
#输出结果
[[1, 2, 3], [8, 9, 4], [7, 6, 5]]
解析:list0初始化为:[1,2,3,4,5,6,7,8,9] ,dx,dy用来控制方向,list1是最终的结果列表,list1初始化为:[[None,None,None],[None,None,None],[None,None,None]],而后通过for循环分别将list1的元素赋值:list[0][0] = 1 list[0][1] = 2 list[0][2] = 3 转向,list[1][2] = 4 list[2][2] = 5 转向,list[2][1] = 6 list[2][0] = 7 转向,list[1][0] = 8 转向,list[1][1] = 9 , 本题的关键在于构造dx,dy转向表 和 对边界的判断,此方法思路清晰,代码简洁,值得小伙伴们学习。