class Solution:
def findDiagonalOrder(self, matrix: List[List[int]]) -> List[int]:
if len(matrix) == 0:
return []
M = len(matrix)
N = len(matrix[0])
result = []
#生成向右上的向量首坐标
up = [(i, 0) for i in range(0, M, 2)]
up.extend([(M - 1, j) for j in range(1, N) if (M - 1 + j) % 2 == 0])
#生成向左下的向量首坐标
down = [(0, i) for i in range(1, N, 2)]
down.extend([(j, N - 1) for j in range(1, M) if (N - 1 + j) % 2 == 1])
num = 0
nums = len(up) + len(down)
#依次遍历即可
while(num < nums):
if(num % 2 == 0):
i, j = up[int(num / 2)]
while(1):
if i < 0 or j < 0 or i >= M or j >= N:
break
result.append(matrix[i][j])
i -= 1
j += 1
else:
i, j = down[int(num / 2)]
while(1):
if i < 0 or j < 0 or i >= M or j >= N:
break
result.append(matrix[i][j])
i += 1
j -= 1
num += 1
return result
以下为大神解法:
class Solution:
def findDiagonalOrder(self, matrix: List[List[int]]) -> List[int]:
if not matrix:
return []
m = len(matrix)
n = len(matrix[0])
# m+n-1为对角线的条数
result = []
for x in range(m+n-1):
if x % 2 == 0:# x为偶数
i = x if x < m else m - 1
j = x - i
while i>=0 and j <n:
result.append(matrix[i][j])
i -=1
j +=1
else:# x为奇数
j = x if x <n else n - 1
i = x - j
while j >=0 and i < m:
result.append(matrix[i][j])
i += 1
j -= 1
return result
大神发现的遍历规律