• 每日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
  • 相关阅读:
    双六
    除法取模
    欧拉函数及费马小定理
    基础模运算
    Leeetcode--581. Shortest Unsorted Continuous Subarray
    Codeforces Round #541--1131F. Asya And Kittens(基础并查集)
    leetcode--200. Number of Islands
    leetcode--21. Merge Two Sorted Lists
    leetcode--155. Min Stack
    Codeforces Round #539--1113B
  • 原文地址:https://www.cnblogs.com/LLLLgR/p/14782881.html
Copyright © 2020-2023  润新知