【leetcode】4. 数组-对角线遍历
题目
给定一个含有 M x N 个元素的矩阵(M 行,N 列),请以对角线遍历的顺序返回这个矩阵中的所有元素,对角线遍历如下图所示。
难易程度:Medium
示例:
输入:
[
[ 1, 2, 3 ],
[ 4, 5, 6 ],
[ 7, 8, 9 ]
]
输出: [1,2,4,7,5,3,6,8,9]
解释:
说明:
给定矩阵中的元素总数不会超过 100000。
题解
分析
本题需要仔细揣摩题目,找出规律。抓住两点:
- 题目实例,如果给出的
3*3的矩阵不能有所收获的话,可以尝试更其他组合的矩阵,比如4*3等等。 - 题图,图的表现力更强一些,同样,如果题目种的图不能发现规律的话,可以尝试更多的矩阵。
经过一通分析,发现如下规律[为表述方便设某一元素的坐标为(x,y)]: x + y为偶数是遍历方向为:左下->右上,x--,y++,x + y为奇数是遍历方向为:右上->左下,y--, x++- 一共遍历
M + N - 1次,即遍历[0, M+N-2] - 第n次遍历是
n = x + y,n从0开始 - 每次遍历的时候,
左下->右上若x < M则起点为(n, 0)否则为(M-1,n-M-1);右上->左下若y < N则起点为(0, n)否则为(n-N-1, N-1)
具体分析如下(以示例种3*3矩阵举例):
第0趟 x = 0, y = 0; x + y = 0,0是偶数,左下->右上,[(0,0)],[1]
第1趟 x = 0, y = 1; x + y = 1,1是奇数,右上->左下,[(0,1),(1,0)],[2,4]
第2趟 x = 2, y = 0; x + y = 2,2是偶数,左下->右上,[(2,0),(1,1),(0,2)],[7,5,3]
第3趟 x = 1, y = 2; x + y = 3,3是奇数,右上->左下,[(1,2),(2,1)],[6,8]
第4趟 x = 2, y = 2; x + y = 4,4是偶数,左下->右上,[(2,2)],[9]
因此,对角遍历后的结果为[1,2,4,7,5,3,6,8,9]
时间复杂度:O(N*N)
空间复杂度:O(N)
代码
1 | class Solution { |