这个题解采用了分组和遍历的策略来实现对角线遍历。首先,根据矩阵元素的坐标(i, j),每个元素被分配到对应的对角线组里,这个组的索引是i+j。这意味着所有在同一个对角线上的元素会被放在同一个列表中。创建了一个列表数组ans来存储这些对角线组。然后,根据对角线的索引顺序,决定了遍历的方向:偶数索引的对角线从上到下遍历(逆序插入到结果列表中),奇数索引的对角线则从下到上遍历(顺序插入)。这样可以确保输出结果符合对角线遍历的要求。
时间复杂度: O(m*n)
空间复杂度: O(m*n)
class Solution:
def findDiagonalOrder(self, mat: List[List[int]]) -> List[int]:
m = len(mat) # 获取矩阵的行数
n = len(mat[0]) # 获取矩阵的列数
ans = [[] for i in range(m+n-1)] # 创建足够的空列表以存储所有对角线的元素
ans_flatten = [] # 最终的结果列表
for i in range(m):
for j in range(n):
ans[i+j].append(mat[i][j]) # 将元素添加到对应的对角线列表中
for i, li in enumerate(ans): # 遍历每个对角线的列表
if i%2 == 0: # 偶数索引对角线逆序添加
for j in range(len(li)-1, -1, -1):
ans_flatten.append(li[j])
else: # 奇数索引对角线顺序添加
for j in range(len(li)):
ans_flatten.append(li[j])
return ans_flatten # 返回遍历结果