算法练习-遍历对角线
原题链接:https://leetcode.cn/problems/diagonal-traverse/description/?envType=daily-question&envId=2025-08-25
代码功能
-
输入:一个二维矩阵(列表的列表)
-
输出:按对角线顺序遍历的所有元素组成的列表
-
遍历方向:从左上角开始,先向右上方向遍历,然后向左下方向,交替进行
代码逐行解释
from typing import List # 导入类型注解模块,用于指定函数参数和返回值的类型class Solution:def findDiagonalOrder(self, mat: List[List[int]]) -> List[int]:# 处理空矩阵的情况if not mat or not mat[0]:return [] # 如果矩阵为空或没有行,返回空列表m, n = len(mat), len(mat[0]) # 获取矩阵的行数(m)和列数(n)ans = [] # 初始化结果列表# 遍历所有可能的对角线(从左上到右下,对角线数量为m+n-1)for k in range(m + n - 1):# 计算当前对角线的列索引范围min_col = max(0, k - m + 1) # 当前对角线的最小列索引max_col = min(k, n - 1) # 当前对角线的最大列索引if k % 2 == 0: # 如果k是偶数,从左下到右上遍历# 从左到右遍历(列索引从小到大)for j in range(min_col, max_col + 1):i = k - j # 计算行索引(因为i+j=k)ans.append(mat[i][j]) # 将当前元素添加到结果列表else: # 如果k是奇数,从右上到左下遍历# 从右到左遍历(列索引从大到小)for j in range(max_col, min_col - 1, -1):i = k - j # 计算行索引ans.append(mat[i][j]) # 将当前元素添加到结果列表return ans # 返回最终结果
示例说明
假设有一个2×3矩阵:
[[1, 2, 3],[4, 5, 6]
]
遍历顺序将是:
-
第一条对角线 (k=0): [1]
-
第二条对角线 (k=1): [2, 4](由于k=1是奇数,从右到左遍历)
-
第三条对角线 (k=2): [5, 3](由于k=2是偶数,从左到右遍历)
-
第四条对角线 (k=3): [6]
最终结果: [1, 2, 4, 5, 3, 6]
关键点
-
每条对角线上的元素满足:行索引 + 列索引 = k(当前对角线编号)
-
遍历方向交替变化:偶数对角线从左下到右上,奇数对角线从右上到左下
-
通过计算min_col和max_col确定每条对角线的列索引范围