Leetcode 对角线遍历

Leetcode 对角线遍历

题意:给定一个含有 M x N 个元素的矩阵(M行,N列),请以对角线遍历的顺序返回这个矩阵中的所有元素,对角线遍历如下图所示。

示例:

输入:
[
[ 1, 2, 3 ],
[ 4, 5, 6 ],
[ 7, 8, 9 ]
]

输出: [1,2,4,7,5,3,6,8,9]

解释:

思路:

  1. 我们可以斜线部分输出,先不管它的顺序(就是正的输出,反的输出),例如图示:[[1],[2,4],[3,5,7],[6,8],[9]]
    • 这里可以找到规律:上面列表中元素,纵横坐标加起来数不变的.例如:[3,5,7]这个元素 3 , 5 , 7 3,5,7 这个数坐标为(0,2),(1,1),(2,0)它们纵横坐标加起来为 2 2 .
    • 知道上面这个,还有一个问题,就是知道它只能输出到对角线以上的元素.什么意思呢?就是说它只能输出[[1],[2,4],[3,5,7]]后面的不输出.再比如矩阵变成 [ [ 1 , 2 ] , [ 3 , 4 ] , [ 5 , 6 ] , [ 7 , 8 ] ] [[1,2],[3,4],[5,6],[7,8]] 它只能输出成[[1],[2,3]],所以这纵横坐标要会改变.如果还不太明白,就向后看.
  2. 下面就是把上面输出的,一个取正,一个取反,(这里指列表方向)
class Solution(object):
    def findDiagonalOrder(self, matrix):
        """
        :type matrix: List[List[int]]
        :rtype: List[int]
        """
        if not matrix:
            return []
        m = len(matrix)
        n = len(matrix[0])
        max_mn = m+n-1
        # i = 0
        # j = 0
        res_index = []
        print(max_mn)
        flag = 0
        for sum_ij in range(max_mn):
            i = flag
            j = sum_ij - flag
            if j == n:
                flag += 1
                i = flag
                j = sum_ij-flag
                # print("j==n:",i,j)
            temp = []
            # print(i, j)
            # print("----")
            while 0 <=i< m and 0 <=j< n:
                temp.append(matrix[i][j])
                i += 1
                j -= 1
                # print(i, j)
            res_index.append(temp)
        l = len(res_index)
        res = []
        # 偶数取反,奇数取正
        for k in range(l):
            if k%2 == 0:
                res += res_index[k][::-1]
            else:
                res += res_index[k]
        return res

测试结果:超过100%玩家.

这里写图片描述

猜你喜欢

转载自blog.csdn.net/koukehui0292/article/details/82430853