题目描述:
题解:
1.逆时针的遍历顺序为:右 下 左 上,定义一个directions的list,分别对应这四个方向。如果当前方向的下一个位置到达matrix边界或者已经被访问过,则变换为下一个方向。
2.定义一个和输入matrix大小相同的flag数组,初始化为全0,记录[i,j]位置是否被访问过,dir_idx表示当前沿着directions数组中的第几个方向进行遍历,result记录结果。
3.posx posy分别表示当前位置的坐标,初始化为0,dir_idx也初始化为0,将当前[posx,posy]对应的matrix值加入result中,flag对应位置标记为1,如果沿着当前direction[dir_idx]的下一个位置不合法或者对应flag为1,则使用下一个direction,得到一个新坐标,直到flag中所有位置被标记为1.
class Solution:
def spiralOrder(self, matrix: List[List[int]]) -> List[int]:
directions = [[0,1],[1,0],[0,-1],[-1,0]]
result = []
posx = 0
posy = 0
rows = len(matrix)
cols = len(matrix[0])
flag = [[0 for i in range(cols)]for j in range(rows)]
dir_idx = 0
flagsum = 0
while flagsum<rows*cols:
result.append(matrix[posx][posy])
flag[posx][posy] = 1
flagsum+=1
if posx+directions[dir_idx][0]==rows or posy+directions[dir_idx][1]==cols or flag[posx+directions[dir_idx][0]][posy+directions[dir_idx][1]]==1:
dir_idx = (dir_idx+1)%4
posx = posx+directions[dir_idx][0]
posy = posy+directions[dir_idx][1]
return result