版权声明:此BLOG为个人BLOG,内容均来自原创及互连网转载。最终目的为记录自己需要的内容或自己的学习感悟,不涉及商业用途,转载请附上原博客。 https://blog.csdn.net/bulo1025/article/details/89285063
题目描述
给定一个含有 M x N 个元素的矩阵(M 行,N 列),请以对角线遍历的顺序返回这个矩阵中的所有元素,对角线遍历如下图所示。
示例:
输入:
[
[ 1, 2, 3 ],
[ 4, 5, 6 ],
[ 7, 8, 9 ]
]
输出: [1,2,4,7,5,3,6,8,9]
解释:
思路分析
- number 记录当前还需要放入结果列表的数有多少个
- 首先分析向右上方遍历的情况
– 1.第一步向右上遍历,但无法向上,所以是向右遍历,条件是,当 i == 0 时,j + 1 ,并且将向上姿态更新为向下。
– 2.正常的向右上,这里需要 i 减1,j 加1。
– 3.无法向右遍历了,因为到了最后一列,所以条件是:当 j == 列长度-1的时候,就直接向下,并且将向上姿态更新为向下。 - 向左下方遍历的情况
– 1.往左下,当前列是0的时候,只能往下了,条件是:j == 0 时,i += 1,并且需要将姿态更新为向上。
– 2. 正常往左下,条件是:i += 1, j -= 1。
– 3.往左下,当前行为最后一行,只能往右,条件是:i = 最后一行,j += 1,并且需要将姿态更新为向上。
代码示例
class Solution(object):
def findDiagonalOrder(self, matrix):
"""
:type matrix: List[List[int]]
:rtype: List[int]
"""
if matrix == []:
return []
row,col = len(matrix),len(matrix[0])
ans = []
number = row * col
i = j = 0
up = True
while number:
number -= 1
ans.append(matrix[i][j]) # 将所在的数append进去
if up:
if j == col - 1: # 如果上行,
i += 1 # 加一行
up = False
elif i == 0: # 在第一行,不能上行了
j += 1
up = False
else:
i -= 1
j += 1
else:
if i == row - 1: # 如果行到了最后一行
j += 1
up = True # 需要向右上移动了
elif j == 0:
i += 1
up = True
else:
i += 1
j -= 1
return ans
2019年4月13日 于燕园北