题目描述:
给定一个含有 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
著作权归领扣网络所有。商业转载请联系官方授权,非商业转载请注明出处。
解题思路:
假设二维数组m*n,通过下角标的变化模拟遍历过程。
- 斜向上角标变化(-1,+1)
- 斜向下角标变化(+1,-1)
- 遇到边界后,要么(0,+1),要么(+1,0)
主要要找到规律,什么时候向下什么时候向上。我在这里利用行列角标的同奇同偶以及边界条件判断下一步走向。举例说明:
在row=0时,row+col为偶数的情况下:
col到了边界,则向下,否则向右。
在这之后一定都是斜向下直至到边界。
其他边界类似,都是这么判断走向。
基于此,初步设计代码如下:
class Solution:
def findDiagonalOrder(self, matrix):
if not matrix:
return []
if len(matrix)==1:
return matrix[0]
if len(matrix[0])==1:
return [matrix[i][0] for i in range(len(matrix))]
col_edge,row_edge = len(matrix[0]),len(matrix)
row,col = 0,0
res = []
res.append(matrix[row][col])
while True:
if row == 0 and not (row+col)&1 and col+1 < col_edge:
col = col + 1
res.append(matrix[row][col])
if row==row_edge-1 and col == col_edge-1:
return res
while True:
if row+1 == row_edge or col-1 < 0:
break
row,col = row+1, col-1
res.append(matrix[row][col])
if col+<