这里可能很多人大多人会选择难搞的箭头方向旋转+边界判断的算法,但是这里给出一个比较容易弄的,BFS算法:
class Solution:
def findDiagonalOrder(self, mat: List[List[int]]) -> List[int]:
if not mat:
return []
m,n=len(mat),len(mat[0])
ret=[]
loc=[(0,0)]
visited=set([(0,0)])
flag=-1
while loc:
nexts=[]
vals=[]
for i,j in loc:
vals.append(mat[i][j])
i1,j1=i,j+1
if 0<=i1<m and 0<=j1<n and (i1,j1 ) not in visited:
nexts.append((i1,j1))
visited.add((i1,j1))
i2,j2=i+1,j
if 0<=i2<m and 0<=j2<n and (i2,j2) not in visited:
nexts.append((i2,j2))
visited.add((i2,j2))
ret+=vals[::flag]
flag*=-1
loc=nexts
return ret
用一个路径集合保存已经读取过的坐标,每一次bfs我们遵循先右再左的方式,用路径集合去掉有重复的部分,保存元素的时候记得每轮翻转一次就可以。