分类:数组-特定顺序遍历二维数组
题目描述:
给定一个含有 M x N 个元素的矩阵(M 行,N 列),请以对角线遍历的顺序返回这个矩阵中的所有元素,对角线遍历如下图所示。
解题思路:
对角线
对角线的性质是行号xx和列号xx之和x+yx+y为定值,m imes nm×n矩阵的对角线一共有m+n-1m+n−1条。
用变量count记录当前正在输出第几条对角线,根据count的奇偶性可以知道这条对角线是向右上走还是向左下走。如果count从0开始,那么第偶数条对角线向右上走,第奇数条对角线向左下走。
确定起点和终点
如果是一个无限大的矩阵,向右上走的对角线起点一定是(count, 0),终点是(0, count),每次只需让列号y+1y+1,行号x-1x−1,从起点到终点即可。向左下走的对角线也能容易推出起点和终点。
现在是一个m imes nm×n的矩阵,可以想象成无限大矩阵加上了行号约束0 le x le n-10≤x≤n−1,列号约束0 le y le m-10≤y≤m−1。
以向右上走的对角线为例,对角线由于受到行号约束,被迫将行号为最大值m-1m−1的点作为起点,根据对角线的性质可以算出列号为count-(m-1)count−(m−1),同理也可以计算出受到约束下对角线的终点坐标。
代码里没有计算对角线的终点,而是直接把行号和列号约束作为while循环的条件,也可达到目的。
class Solution: def findDiagonalOrder(self, mat: List[List[int]]) -> List[int]: result = [] if len(mat) == 0: return result m = len(mat) n = len(mat[0]) count = 0 # i + j == 0 count记录当前输出第几条对角线 while count <= m + n -1: #m+n-1为对角线的总条数 # 向右上走,起点在左下 if count % 2 == 0 : x = count if (count < m) else (m -1) y = count - x while (x >= 0 and y <= n-1): result.append(mat[x][y]) x -= 1 y += 1 # 向左下走,起点在右上 else: y = count if (count < n) else (n -1) x = count - y while (x <= m-1 and y >= 0): result.append(mat[x][y]) x += 1 y -= 1 count += 1 return result