leetcode_498 对角线遍历

117 阅读1分钟

要求

给你一个大小为 m x n 的矩阵 mat ,请以对角线遍历的顺序,用一个数组返回这个矩阵中的所有元素。

示例 1:

image.png

输入: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  

image.png

重点问题

解题思路:

当向右上方走的时候,有两种情况会造成碰壁,因而需要转弯,CASE 1:碰到上方的壁(x 无法再 -1),但还没碰到右方的壁(y 可以 +1)在这种情况下,下一步的坐标为y += 1, 比如上方示例图里的 1 -》 2。 CASE 2: 碰到右方的壁(y 不能 + 1)在这种情况下,下一步的坐标为x += 1, 比如示例图里的 3 -》 6 向左下方走同理:CASE1. 碰左壁但未碰下壁:x += 1;CASE2. 碰下壁:y += 1.