问题来源:leetcode59题(python写法)
链接:力扣
给一个正整数 n
,生成一个包含 1
到 n^2
所有元素,且元素按顺时针顺序螺旋排列的 n x n
正方形矩阵 matrix
。
具体例子看力扣链接
这里提供一种思路,假设n=3,这里会使用一个边界为5*5的矩阵mat把3*3矩阵围住,然后在边界处设置-1。类似下图:
[-1, -1, -1, -1, -1]
[-1, 0, 0, 0, -1]
[-1, 0, 0, 0, -1]
[-1, 0, 0, 0, -1]
[-1, -1, -1, -1, -1]
初始位置为a=1,b=1,先置mat[a][b]=1,接着由于螺旋矩阵一开始是往右走的,咱们只需要在最开始的while里面优先判断往右即可,即如果mat[a][b+1]==0,就开始赋值,然后这里是b+1,是b且是加号,所以在while里面就要将b一直加1,直到mat[a][b+1]!=0。接着的while顺序怎么写都行,mat[a][b-1]==0,mat[a+1][b]==0,mat[a-1][b]==0,都类似mat[a][b+1]==0的写法。
最后将mat边界内的矩阵取出来即可。
这样可以省去各种判断,什么左闭右开也不用管。
class Solution(object):
def generateMatrix(self, n):
"""
:type n: int
:rtype: List[List[int]]
"""
# 设置一个(n+2)*(n+2)的矩阵
mat=[[0 for _ in range(n+2)] for _ in range(n+2)]
# 将矩阵边界置为-1
for i in range(n+2):
mat[0][i]=-1
mat[-1][i]=-1
mat[i][0]=-1
mat[i][-1]=-1
# num从1计算到n*n
num=1
a=1#一维坐标
b=1#二维坐标
mat[a][b]=num#先将初始位置赋值上去
num+=1
while num<=n*n:
# 最开始需要向右走
while mat[a][b+1]==0:
mat[a][b + 1] = num
num += 1
b += 1
# 接下来三个顺序可以随便写
while mat[a][b-1]==0:
mat[a][b - 1] = num
num += 1
b -= 1
while mat[a+1][b]==0:
mat[a+1][b] = num
num += 1
a += 1
while mat[a-1][b]==0:
mat[a-1][b] = num
num += 1
a -= 1
# 将矩阵边界内的n*n矩阵取出来
out = []
for i in range(1, n + 1):
out.append(mat[i][1:(n + 1)])
return out
# solved
if __name__ == "__main__":
print(Solution().generateMatrix(5))
最后附上一个还不错的速度和内存用量
说明:如有发现重复思路的纯属巧合,联系删。