1424. 对角线遍历 II
大约 2 分钟
--- 

1424. 对角线遍历 II
- 标签:数组、排序、堆(优先队列)
- 难度:中等
题目链接
题目大意
描述:给定一个二维整数数组 (每行长度可能不同),按对角线顺序遍历。对角线方向为「右上到左下」,即同一对角线上元素的行列索引和 相同。
要求:返回按对角线顺序遍历得到的一维数组。
说明:
- 。
- 。
- 总元素数 。
示例:
- 示例 1:

输入:nums = [[1,2,3],[4,5,6],[7,8,9]]
输出:[1,4,2,7,5,3,8,6,9]- 示例 2:

输入:nums = [[1,2,3,4,5],[6,7],[8],[9,10,11],[12,13,14,15,16]]
输出:[1,6,2,8,7,3,9,4,12,10,5,13,11,14,15,16]解题思路
思路 1:按 (i+j, -i) 排序
1. 核心思想
对于每个元素 :
- 属于第 条对角线。
- 在同一对角线内,按 降序(即从下到上)遍历。
因此可以将所有元素按键 排序。
2. 具体步骤
第 1 步:遍历 ,将所有 加入列表。
第 2 步:按 排序。
第 3 步:提取值返回。
3. 举例说明
以 为例:
元素的 :
- :
- :
- :
- :
- :
- :
- :
- :
- :
排序后顺序:
输出:。
思路 1:代码
class Solution:
def findDiagonalOrder(self, nums: List[List[int]]) -> List[int]:
elements = []
for i, row in enumerate(nums):
for j, val in enumerate(row):
elements.append((i + j, -i, val)) # (对角线, 行倒序, 值)
elements.sort()
return [val for _, _, val in elements]思路 1:复杂度分析
- 时间复杂度:, 为总元素数。
- 空间复杂度:。
思路 2:BFS 层序遍历
核心观察:遍历顺序就是 BFS 的层序遍历,从 开始,每层向右和向下扩展。
from collections import deque
class Solution:
def findDiagonalOrder(self, nums: List[List[int]]) -> List[int]:
ans = []
q = deque([(0, 0)])
visited = {(0, 0)}
while q:
i, j = q.popleft()
ans.append(nums[i][j])
# 向下走
if i + 1 < len(nums) and j < len(nums[i + 1]) and (i + 1, j) not in visited:
q.append((i + 1, j))
visited.add((i + 1, j))
# 向右走
if j + 1 < len(nums[i]) and (i, j + 1) not in visited:
q.append((i, j + 1))
visited.add((i, j + 1))
return ansBFS 法 时间,但需要处理访问标记。