要求
给你一个大小为 m x n 的矩阵 mat ,请以对角线遍历的顺序,用一个数组返回这个矩阵中的所有元素。
示例 1:
输入:mat = [[1,2,3],[4,5,6],[7,8,9]]
输出:[1,2,4,7,5,3,6,8,9]
示例 2:
输入:mat = [[1,2],[3,4]]
输出:[1,2,3,4]
核心代码
class Solution:
def findDiagonalOrder(self, mat: List[List[int]]) -> List[int]:
m = len(mat)
if not m:
return []
n = len(mat[0])
if not n:
return []
cnt = 0
x,y = 0,0
res = list()
direction = "right"
while cnt < m * n:
cnt += 1
res.append(mat[x][y])
if direction == "right":
if x >= 1 and y < n - 1:
x -= 1
y += 1
continue
else:
direction = "left"
if x == 0 and y < n - 1:
y += 1
elif y == n-1:
x += 1
else:
if x < m - 1 and y >= 1:
x += 1
y -= 1
continue
else:
direction = "right"
if x == m - 1:
y += 1
elif y == 0 and x < m - 1:
x += 1
return res
重点问题
解题思路:
当向右上方走的时候,有两种情况会造成碰壁,因而需要转弯,CASE 1:碰到上方的壁(x 无法再 -1),但还没碰到右方的壁(y 可以 +1)在这种情况下,下一步的坐标为y += 1, 比如上方示例图里的 1 -》 2。 CASE 2: 碰到右方的壁(y 不能 + 1)在这种情况下,下一步的坐标为x += 1, 比如示例图里的 3 -》 6 向左下方走同理:CASE1. 碰左壁但未碰下壁:x += 1;CASE2. 碰下壁:y += 1.