题目描述
给定一个含有 M x N 个元素的矩阵(M 行,N 列),请以对角线遍历的顺序返回这个矩阵中的所有元素,对角线遍历如下图所示。
示例:
输入:
[
[ 1, 2, 3 ],
[ 4, 5, 6 ],
[ 7, 8, 9 ]
]
输出: [1,2,4,7,5,3,6,8,9]
解释:
说明:
- 给定矩阵中的元素总数不会超过 100000 。
分析与解答
关键在于找规律,将规律归类,但这并不容易。在找规律的时候往往更大的矩阵更容易发现,因为更大的场景会将主要规律凸显出来,自己可以画一个4行4列或5行5列的矩阵找下。
规律就两类,一类是斜上以及斜上到顶后向哪走;另一类是斜下以及斜下到底后向哪走。
class Solution:
def findDiagonalOrder(self, matrix: List[List[int]]) -> List[int]:
if not matrix:
return []
R = len(matrix)
C = len(matrix[0])
i = j = 0
l = [matrix[0][0]]
while len(l) != R * C:
# 第一类:斜上,这也是初始步骤
# 首先能斜上就先斜上
while i - 1 >= 0 and j + 1 < C:
i = i - 1
j = j + 1
l.append(matrix[i][j])
# 斜上到顶能右就右,不能右就下
if j + 1 < C:
j = j + 1
l.append(matrix[i][j])
elif i + 1 < R:
i = i + 1
l.append(matrix[i][j])
# 第二类:斜下
# 能斜下就斜下
while i + 1 < R and j - 1 >= 0:
i = i + 1
j = j - 1
l.append(matrix[i][j])
# 斜下到底能下就下,不能下就右
if i + 1 < R:
i = i + 1
l.append(matrix[i][j])
elif j + 1 < C:
j = j + 1
l.append(matrix[i][j])
return l