题目描述:
题解:
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