题目

给定一个含有M×N个元素的矩阵(M行,N列),请以对角线遍历的顺序返回这个矩阵中的所有元素,对角线遍历如下图所示。
image.png

思路

先简化问题,一步一步地来

1. 确定循环次数

image.png

2. 方向变更

方向跟遍历次数的奇偶性相关,因此遍历次数对2取余即可。
大致框架

  1. m, n = len(matrix), len(matrix[0])
  2. count = m + n - 1
  3. answer = [] # 用于保存遍历结果
  4. start_point = (0, 0)
  5. for i in range(count):
  6. if i % 2 == 0:
  7. # 下一步遍历起始点为start_point的右上方向的对角线元素
  8. pass
  9. else:
  10. # 下一步遍历起始点为start_point的右上方向的对角线元素
  11. pass
  12. return answer

4. 遍历起始点为(x,y)的右上角对角线元素

右上方向移动:x -= 1, y += 1
边界条件 x >= 0, y < n (横坐标不为负数,纵坐标不大于列数)

考虑越界处理
image.png

  1. while x >= 0 and y < n:
  2. answer.append(matrix[x][y])
  3. x -= 1
  4. y += 1
  5. if y < n:
  6. x += 1
  7. else:
  8. x += 2
  9. y -= 1

5.遍历起始点为(x, y)的左下角对角线元素

左下方向移动:x += 1 , y -= 1
边界条件:x < m , y >= 0

  1. while x < m and y >= 0:
  2. answer.append(matrix[x][y])
  3. x += 1
  4. y -= 1
  5. if x < m:
  6. y += 1
  7. else:
  8. x -= 1
  9. y += 2
  1. class Solution:
  2. def findDiagonalOrder(self, matrix: List[List[int]]) -> List[int]:
  3. if len(matrix) == 0: return []
  4. m, n = len(matrix), len(matrix[0])
  5. count = m + n - 1
  6. answer = [] # 用于保存遍历结果
  7. x, y = 0, 0 # start_point = (0, 0)
  8. for i in range(count):
  9. if i % 2 == 0:
  10. # 下一步遍历起始点为start_point的右上方向的对角线元素
  11. while x >= 0 and y < n:
  12. answer.append(matrix[x][y])
  13. x -= 1
  14. y += 1
  15. if y < n:
  16. x += 1
  17. else:
  18. x += 2
  19. y -= 1
  20. else:
  21. # 下一步遍历起始点为start_point的右上方向的对角线元素
  22. while x < m and y >= 0:
  23. answer.append(matrix[x][y])
  24. x += 1
  25. y -= 1
  26. if x < m:
  27. y += 1
  28. else:
  29. x -= 1
  30. y += 2
  31. return answer