规律:如果都是主对角线,下标之和i+j为定值t,该定值刚好是第t条对角线
如果都是副对角线,下标之差的绝对值为定值
接下来是对角线的条数:m+n-1条
最后判断一下对角线的方向即可(大小正好是和值)
上公式
# 已知 i + j = t 和 0 <= i < m 还有 0 <= j < n
# 0 <= i < m, 0 <= t - i < n
# 0 <= i < m, t - n < i <= t
代码
class Solution(object):
def findDiagonalOrder(self, mat):
"""
:type mat: List[List[int]]
:rtype: List[int]
"""
m=len(mat)
n=len(mat[0])
ret=[]
num=m+n-1
for t in range(num):
#偶数根就向上
if not t%2:
#范围是收缩的,取交集
#python的range是左闭右开
ret+=[mat[i][t-i] for i in range(min(m-1,t),max(-1,t-n),-1)]
else:
ret+=[mat[i][t-i] for i in range(max(0,t-n+1),min(m,t+1))]
return ret