这个题看题解,官方题解比较符合我的思路。简单来说就是莽过去,思路和遍历顺序一样,需要记录 已访问点,设置遍历长度、边界判断、方向
#遍历长度
m,n = len(arr),len(arr[0)]
total = m*n
#已访问点
vis = [[0]*n for _ in range(m)]
#边界判断
def area(i,j,m,n):
if m>i>=0 and 0<=j<n:
return True
return False
根据边界和已访问点判断是否改变方向,满足条件时方向指针 index +1
#方向
direct = [[0,1],[1,0],[0,-1],[-1,0]] #l,d,l,u
if not area(i1,j1,m,n) or vis[i1][j1]: #若超出边界或已经访问,则需改变方向
index = (index+1)%4 #改变方向,周期为4
最后打印结果,整体代码如下:
def spiralOrder(self, mat: List[List[int]]) -> List[int]:
if not mat: return mat
def area(i,j,m,n):
if m>i>=0 and 0<=j<n:
return True
return False
m,n = len(mat),len(mat[0])
vis = [[0]* n for _ in range(m)]
total = m*n
res = []
direct = [[0,1],[1,0],[0,-1],[-1,0]] #l,d,l,u
i,j,index = 0,0,0
for k in range(total):
res.append(mat[i][j])
vis[i][j] = 1 #已访问
#判断以当前方向进行时下一个点是否符合条件,若超出边界或已经访问,则需改变方向
i1,j1 = i+direct[index][0],j+direct[index][1]
if not(area(i1,j1,m,n) and not vis[i1][j1]):
index = (index+1)%4 #改变方向
#以当前方向遍历
i += direct[index][0]
j += direct[index][1]
return res
本文介绍了一种螺旋遍历二维矩阵的方法,并提供了详细的Python实现代码。通过定义边界判断、已访问点记录及方向变换等关键步骤,实现了从外到内、按层螺旋遍历矩阵的功能。
723

被折叠的 条评论
为什么被折叠?



