LeetCode每日一题——498. 对角线遍历

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

题目

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

示例 1:

2345_image_file_copy_6.jpg

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

思路

模拟题。可以看出来从第一行开始开始(这里的行指的是对角线),奇数次行从该行对角线左下到右上依次遍历,偶数次行从该对角线右上到左下依次遍历,下标的遍历规律很好找,奇数次(i-1, j+1),偶数次(i+1, j-1)。

重要的是边界坐标如何改变,可以看出上半部分奇数行到偶数行改变时,坐标向右移一位;偶数行到奇数行改变是,坐标向下移一位。但是下班部分正好相反,如何找到这个边界是关键,这里使用的是判断边界坐标向右移或者向下移是否越界,没有越界就按上半边规律走,越界了就按相反的规律走

题解

# 对角线输出
def findDiagonalOrder(mat: List[List[int]]) -> List[int]:
    index, ans, row = (0, 0), [], 1
    while row <= len(mat) + len(mat[0]) - 1:
    # 奇数行
        if row % 2 != 0:
            for i in range(row):
                ans.append(mat[index[0]][index[1]])
                if 0 <= index[0] - 1 < len(mat) and 0 <= index[1] + 1 < len(mat[0]):
                    index = (index[0]-1, index[1] +1)
                else:
                    break
            # 边界坐标转换
            if index[1] + 1 == len(mat[0]):
                index = (index[0] + 1, index[1])
            else:
                index = (index[0], index[1] + 1)
            row += 1
        else:
        # 偶数行
            for i in range(row):
                ans.append(mat[index[0]][index[1]])
                if 0 <= index[0] + 1 < len(mat) and 0 <= index[1] - 1 < len(mat[0]):
                    index = (index[0] + 1, index[1] - 1)
                else:
                    break
            #  边界坐标转换
            if index[0] + 1 == len(mat):
                index = (index[0], index[1] + 1)
            else:
                index = (index[0] + 1, index[1])
            row += 1
    return ans
目录
相关文章
|
4月前
【LeetCode 37】106.从中序与后序遍历构造二叉树
【LeetCode 37】106.从中序与后序遍历构造二叉树
33 0
|
6月前
|
算法 Java
LeetCode第94题二叉树的中序遍历
文章介绍了LeetCode第94题"二叉树的中序遍历"的解法,使用递归实现了中序遍历的过程,遵循了"左根右"的遍历顺序,并提供了清晰的Java代码实现。
LeetCode第94题二叉树的中序遍历
|
6月前
|
算法 Python
【Leetcode刷题Python】剑指 Offer 33. 二叉搜索树的后序遍历序列
本文提供了一种Python算法,用以判断给定整数数组是否为某二叉搜索树的后序遍历结果,通过识别根节点并递归验证左右子树的值是否满足二叉搜索树的性质。
32 3
|
6月前
|
Python
【Leetcode刷题Python】105. 从前序与中序遍历序列构造二叉树
LeetCode上105号问题"从前序与中序遍历序列构造二叉树"的Python实现,通过递归方法根据前序和中序遍历序列重建二叉树。
40 3
|
6月前
|
Python
【Leetcode刷题Python】145. 二叉树的后序遍历
LeetCode上145号问题"二叉树的后序遍历"的Python实现方法。
30 2
|
6月前
|
Python
【Leetcode刷题Python】144. 二叉树的前序遍历
LeetCode上144号问题"二叉树的前序遍历"的Python实现方法。
29 1
|
6月前
|
存储 算法 Java
LeetCode经典算法题:二叉树遍历(递归遍历+迭代遍历+层序遍历)以及线索二叉树java详解
LeetCode经典算法题:二叉树遍历(递归遍历+迭代遍历+层序遍历)以及线索二叉树java详解
96 0
|
6月前
|
Python
【Leetcode刷题Python】94. 二叉树的中序遍历
LeetCode上94号问题"二叉树的中序遍历"的Python实现方法。
22 0
|
8月前
二刷力扣--二叉树(1)基础、遍历
二刷力扣--二叉树(1)基础、遍历
|
8月前
|
SQL 算法 数据可视化
LeetCode题目99:图解中叙遍历、Morris遍历实现恢复二叉树搜索树【python】
LeetCode题目99:图解中叙遍历、Morris遍历实现恢复二叉树搜索树【python】