Leetcode 对角线遍历
题意:给定一个含有 M x N 个元素的矩阵(M行,N列),请以对角线遍历的顺序返回这个矩阵中的所有元素,对角线遍历如下图所示。
示例:
输入:
[
[ 1, 2, 3 ],
[ 4, 5, 6 ],
[ 7, 8, 9 ]
]输出: [1,2,4,7,5,3,6,8,9]
解释:
思路:
- 我们可以斜线部分输出,先不管它的顺序(就是正的输出,反的输出),例如图示:
[[1],[2,4],[3,5,7],[6,8],[9]]
- 这里可以找到规律:上面列表中元素,纵横坐标加起来数不变的.例如:
[3,5,7]
这个元素 这个数坐标为(0,2),(1,1),(2,0)
它们纵横坐标加起来为 . - 知道上面这个,还有一个问题,就是知道它只能输出到对角线以上的元素.什么意思呢?就是说它只能输出
[[1],[2,4],[3,5,7]]
后面的不输出.再比如矩阵变成 它只能输出成[[1],[2,3]]
,所以这纵横坐标要会改变.如果还不太明白,就向后看.
- 这里可以找到规律:上面列表中元素,纵横坐标加起来数不变的.例如:
- 下面就是把上面输出的,一个取正,一个取反,(这里指列表方向)
class Solution(object):
def findDiagonalOrder(self, matrix):
"""
:type matrix: List[List[int]]
:rtype: List[int]
"""
if not matrix:
return []
m = len(matrix)
n = len(matrix[0])
max_mn = m+n-1
# i = 0
# j = 0
res_index = []
print(max_mn)
flag = 0
for sum_ij in range(max_mn):
i = flag
j = sum_ij - flag
if j == n:
flag += 1
i = flag
j = sum_ij-flag
# print("j==n:",i,j)
temp = []
# print(i, j)
# print("----")
while 0 <=i< m and 0 <=j< n:
temp.append(matrix[i][j])
i += 1
j -= 1
# print(i, j)
res_index.append(temp)
l = len(res_index)
res = []
# 偶数取反,奇数取正
for k in range(l):
if k%2 == 0:
res += res_index[k][::-1]
else:
res += res_index[k]
return res
测试结果:超过100%玩家.