题目
给定一个含有M×N个元素的矩阵(M行,N列),请以对角线遍历的顺序返回这个矩阵中的所有元素,对角线遍历如下图所示。
思路
1. 确定循环次数
2. 方向变更
方向跟遍历次数的奇偶性相关,因此遍历次数对2取余即可。
大致框架
m, n = len(matrix), len(matrix[0])count = m + n - 1answer = [] # 用于保存遍历结果start_point = (0, 0)for i in range(count):if i % 2 == 0:# 下一步遍历起始点为start_point的右上方向的对角线元素passelse:# 下一步遍历起始点为start_point的右上方向的对角线元素passreturn answer
4. 遍历起始点为(x,y)的右上角对角线元素
右上方向移动:x -= 1, y += 1
边界条件 x >= 0, y < n (横坐标不为负数,纵坐标不大于列数)
考虑越界处理
while x >= 0 and y < n:answer.append(matrix[x][y])x -= 1y += 1if y < n:x += 1else:x += 2y -= 1
5.遍历起始点为(x, y)的左下角对角线元素
左下方向移动:x += 1 , y -= 1
边界条件:x < m , y >= 0
while x < m and y >= 0:answer.append(matrix[x][y])x += 1y -= 1if x < m:y += 1else:x -= 1y += 2
class Solution:def findDiagonalOrder(self, matrix: List[List[int]]) -> List[int]:if len(matrix) == 0: return []m, n = len(matrix), len(matrix[0])count = m + n - 1answer = [] # 用于保存遍历结果x, y = 0, 0 # start_point = (0, 0)for i in range(count):if i % 2 == 0:# 下一步遍历起始点为start_point的右上方向的对角线元素while x >= 0 and y < n:answer.append(matrix[x][y])x -= 1y += 1if y < n:x += 1else:x += 2y -= 1else:# 下一步遍历起始点为start_point的右上方向的对角线元素while x < m and y >= 0:answer.append(matrix[x][y])x += 1y -= 1if x < m:y += 1else:x -= 1y += 2return answer
