每日leetcode-数组-498. 对角线遍历

分类:数组-特定顺序遍历二维数组

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

解题思路:

对角线
对角线的性质是行号xx和列号xx之和x+yx+y为定值,m imes nm×n矩阵的对角线一共有m+n-1m+n−1条。

用变量count记录当前正在输出第几条对角线,根据count的奇偶性可以知道这条对角线是向右上走还是向左下走。如果count从0开始,那么第偶数条对角线向右上走,第奇数条对角线向左下走。

确定起点和终点
如果是一个无限大的矩阵,向右上走的对角线起点一定是(count, 0),终点是(0, count),每次只需让列号y+1y+1,行号x-1x−1,从起点到终点即可。向左下走的对角线也能容易推出起点和终点。

现在是一个m imes nm×n的矩阵,可以想象成无限大矩阵加上了行号约束0 le x le n-10≤x≤n−1,列号约束0 le y le m-10≤y≤m−1。

以向右上走的对角线为例,对角线由于受到行号约束,被迫将行号为最大值m-1m−1的点作为起点,根据对角线的性质可以算出列号为count-(m-1)count−(m−1),同理也可以计算出受到约束下对角线的终点坐标。

代码里没有计算对角线的终点,而是直接把行号和列号约束作为while循环的条件,也可达到目的。

class Solution:
    def findDiagonalOrder(self, mat: List[List[int]]) -> List[int]:
        result = []
        if len(mat) == 0:
            return result
        m = len(mat)
        n = len(mat[0])
        count = 0 # i + j == 0  count记录当前输出第几条对角线
        while count <= m + n -1:  #m+n-1为对角线的总条数
            # 向右上走,起点在左下
            if count % 2 == 0 :
                x = count if (count < m) else (m -1)  
                y = count - x
                while (x >= 0 and y <= n-1):
                    result.append(mat[x][y])
                    x -= 1
                    y += 1
            # 向左下走,起点在右上
            else:
                y = count if (count < n) else (n -1)
                x = count - y
                while (x <= m-1 and y >= 0):
                    result.append(mat[x][y])
                    x += 1
                    y -= 1
            count += 1
        return result
原文地址:https://www.cnblogs.com/LLLLgR/p/14782881.html