【LeetCode】498. 对角线遍历

image.png

持续创作,加速成长!这是我参与「掘金日新计划 · 6 月更文挑战」的第19天,点击查看活动详情

测试岗位也越来卷了,除了基本的功能测试外,还要有编程基础、脚本经验才脱颖而出。

怎么才能提高我们的编程能力呢,刷LeetCode是最佳的途径之一,话不多数,刷题走起~

一、题目描述:

  • 题目内容

image.png

  • 题目示例

image.png

  • 题目解析

    • m == mat.length
    • n == mat[i].length
    • 1 <= m, n <= 104
    • 1 <= m * n <= 104
    • -105 <= mat[i][j] <= 105

二、思路分析:

我们读取本题,从题目中获知对一组m*n的数组按对角线进行遍历后,输出一个一维数组。在该题中,我们还需要明确如下几点信息:

  • mat[i]元素所有的长度都是一致的
  • m*n 矩形的边界,最大行为len(mat),最大列为len(mat[0])
  • 偶数线路(黑色):m 值呈现递减状态
  • 奇数线路(红色):m 值呈现递增状态 image.png

因此,我们解答本题可以使用线路模拟的方法来解答,思路如下:

  • 首先求出m*n矩阵中存在线路总数为 len(mat)+len(mat[0])-1
  • 当线路为偶数线路时:
    • 当i<len(mat),m取值应该为取i,n取值为0
    • 当i>=len(mat),m取值应该为取len(mat)-1,n取值为i-len(mat)+1;
  • 当线路为奇数线路时:
    • 当i<len(mat[0]),m取值为0,n取值为i
    • 当i>=len(mat[0]),m取值为i-len(mat[0])+1,n取值为len(mat[0])-1
  • 偶数路线m值是递减,n值是递增;奇数路线m值是递增,n值是递减

根据以上思路,我们使用python来实现,代码如下:

class Solution(object):
    def findDiagonalOrder(self, mat):
        """
        :type mat: List[List[int]]
        :rtype: List[int]
        """
        max_m = len(mat)
        max_n = len(mat[0])
        maxroute = max_m + max_n - 1
        ans = []

        for i in range(maxroute):

            if i%2 == 0:
                m = i if i < max_m else max_m-1 
                n = 0 if i < max_m else i-max_m+1
                while m >=0 and n < max_n:
                    ans.append(mat[m][n])
                    m -=1
                    n +=1
            else:
                m = 0 if i < max_n else i-max_n+1
                n = i if i < max_n else max_n-1
                while m < max_m and n >= 0:
                    ans.append(mat[m][n])
                    m +=1
                    n -=1
        
        return ans
复制代码

三、总结:

本题考察我们对矩形坐标位置关系规律查找,可以分为偶数线和奇数线,AC代码提交记录如下:

image.png

  • 时间复杂度O(m*n),m为mat长度,n为mat[i]的长度
  • 空间复杂度O(1)

以上是本期内容,欢迎大佬们点赞评论,下期见~~~

猜你喜欢

转载自juejin.im/post/7109102294930571272