NO54. 螺旋矩阵
作者:互联网
整体思路
->对于螺旋矩阵的题目四点:
1.起始位置
2.移动边界
3.边界
4.结束条件
-<介于本题分别是:
1.左上角(0,0)
2.→↓←↑,使用二维数组存储
3.当每行遍历结束后,需要向内部移动从而达到螺旋
4.所有位置被遍历到
class Solution: def spiralOrder(self, matrix: List[List[int]]) -> List[int]: if not matrix or not matrix[0]:# 特例判断 return [] m, n = len(matrix), len(matrix[0]) #设置行数m和列数n left,right,up,down = 0,n-1,0,m-1 #上下左右 res = [] x,y = 0,0 #现处于的位置 dirs = [(0,1),(1,0),(0,-1),(-1,0)] #移动方向 cur_d = 0 #表示当前的移动方向,dirs[cur_d]为下一移动方向 while len(res) != m*n: #循环条件保证每一个数都被遍历到 res.append(matrix[x][y]) #添加之后做判断 if cur_d == 0 and y == right: cur_d += 1 up += 1#到达右边界,准备往下移动 elif cur_d == 1 and x == down: cur_d += 1 right -= 1 #到达下边界,准备往左移动 elif cur_d == 2 and y == left: cur_d += 1 down -= 1#到达左边界,准备往上移动 elif cur_d == 3 and x == up: cur_d += 1 left += 1#到达上边界,准备往右移动 cur_d %= 4#每4次一轮循环 x+=dirs[cur_d][0] y+=dirs[cur_d][1] #巧妙用移动方向 return res
class Solution: def spiralOrder(self, matrix: List[List[int]]) -> List[int]: if not matrix:return [] x=y=0 # 矩阵元素位置初始化 res = [] # 初始化,存储遍历后的矩阵元素 dx = [ 0, 1, 0,-1] # 方向:右,下,左,上 dy = [ 1, 0,-1, 0] # 注:与通常平面坐标系 记号 不同 di = 0 # 初始化方向变量 visited = set() # 初始化集合,存储已走过的坐标 m,n = len(matrix),len(matrix[0]) # 矩阵的行列 for i in range(m*n): # res.append(matrix[x][y]) # 存储遍历矩阵过的元素 visited.add((x,y)) # 存储遍历过的坐标 tx,ty = x+dx[di],y+dy[di] # 先记录下一步坐标,用于判断下一步怎么走 if 0<=tx<m and 0<=ty<n and (tx,ty) not in visited: # 判断坐标是否需变向,且没有遍历过 x,y = tx,ty else: di = (di+1)%4 # 改变方向,右下左上为一圈,防止方向坐标越界 x,y = x + dx[di],y+dy[di] # 下一步坐标 return res
标签:遍历,matrix,螺旋,res,矩阵,移动,List,NO54,cur 来源: https://www.cnblogs.com/blogy-y/p/16525029.html