1. 问题描述:
给定一个含有 M x N 个元素的矩阵(M 行,N 列),请以对角线遍历的顺序返回这个矩阵中的所有元素,对角线遍历如下图所示。
示例:
输入:
[
[ 1, 2, 3 ],
[ 4, 5, 6 ],
[ 7, 8, 9 ]
]
输出: [1,2,4,7,5,3,6,8,9]
解释:
说明:
给定矩阵中的元素总数不会超过 100000 。
来源:力扣(LeetCode)
链接:https://leetcode-cn.com/problems/diagonal-traverse
2. 思路分析:
对于这种题目我们主要是看怎么样枚举即可,我们可以枚举每一条对角线,分为偶数下标与奇数下标进行枚举,偶数下标的时候从下往上的方向记录答案,奇数下标的时候从上往下的方向记录答案,我们可以先确定一个方向的枚举规律,这里以偶数下标为例(从下往上枚举行),可以发现横坐标为行数与当前枚举的是第i条对角线的最小值,到什么时候枚举结束呢?我们可以找一下最后一个位置的的行号,可以发现最后一个位置的行号为r - 1,那么从后往前需要减去的对角线数目得到的最小的行号为r - 1 - (r + c + 2 - i),整理一下可以得到1 - c + i,可以验证一下是正确的,当我们确定了一个方向之后的规律之后那么另外一个方向就是相反的,调整遍历的顺序即可。
3. 代码如下:
from typing import List
class Solution:
def findDiagonalOrder(self, w: List[List[int]]) -> List[int]:
res = list()
r, c = len(w), len(w[0])
if r == 0 or c == 0: return res
for i in range(r + c - 1):
# 分为奇数下标与偶数下标
if i % 2 == 0:
j = min(i, r - 1)
while j >= max(0, 1 - c + i):
res.append(w[j][i - j])
j -= 1
else:
j = max(0, 1 - c + i)
while j <= min(i, r - 1):
res.append(w[j][i - j])
j += 1
return res