当前位置: 首页 > news >正文

LeetCode 1424:对角线遍历 II | 前缀和分组

LeetCode 1424对角线遍历 II | 前缀和分组引言对角线遍历 IIDiagonal Traverse II是 LeetCode 第 1424 题难度为 Medium。题目要求按照对角线顺序遍历一个二叉树数组返回所有对角线上的节点值。这道题展示了前缀和对角线索引在排序和分组中的应用。对角线遍历的特点是同一条对角线上的所有元素具有相同的行索引与列索引之差或者行索引与列索引之和取决于定义。利用这个性质我们可以将同一条对角线的元素分组然后按顺序输出。问题分析题目描述给定一个二叉树数组 nums其中每个元素是一个列表包含树的节点值。返回对角线遍历的结果其中对角线定义为所有具有相同 (row col) 值的元素。例如输入 nums [[1,2,3],[4,5,6],[7,8,9]]按照对角线遍历的顺序返回 [1,4,2,7,5,3,8,6,9]。对角线的性质在二维数组中对角线上的所有元素满足 row - col 常数 或 row col 常数。如果使用 row col 常数则对角线 0只有 (0, 0)对角线 1(0, 1), (1, 0)对角线 2(0, 2), (1, 1), (2, 0)以此类推同一对角线上的元素按照它们在原始数组中的顺序应该按 row 升序或按 col 降序排列。解决方案哈希表分组def findDiagonalOrder(nums): diagonal_map {} for i, row in enumerate(nums): for j, val in enumerate(row): if i j not in diagonal_map: diagonal_map[i j] [] diagonal_map[i j].append(val) result [] for d in range(len(diagonal_map)): result.extend(reversed(diagonal_map[d])) return result这个方法使用哈希表存储每条对角线的元素。键是 i j对角线索引值是该对角线上的元素列表。然后按对角线索引顺序输出记得反转顺序使得 row 升序。算法详解为什么需要反转在将元素添加到对角线列表时我们按照 row 升序遍历。当按行遍历时对于同一对角线上的元素较小的 row 会先被添加所以列表中的顺序是 row 升序。但是对角线遍历要求较小的 row 在后面因为对角线是从右上到左下的方向。例如对角线 2 有元素 (0, 2), (1, 1), (2, 0)按 row 升序遍历时顺序是 0, 2 - 1, 1 - 2, 0但我们需要输出 2, 0 - 1, 1 - 0, 2即 row 降序。所以需要反转列表。另一种理解当我们按 i j d 收集元素时j 较大的元素先被添加因为 j d - ii 较小时 j 较大所以列表顺序是 j 降序。反转后变成 j 升序即 row 升序。复杂度分析时间复杂度时间复杂度为 O(n)其中 n 是所有元素的总和。每个元素被处理一次添加到哈希表一次从哈希表取出一次。空间复杂度空间复杂度为 O(n)用于存储哈希表和结果数组。代码实现Python 实现def findDiagonalOrder(nums): diagonal_map {} for i, row in enumerate(nums): for j, val in enumerate(row): if i j not in diagonal_map: diagonal_map[i j] [] diagonal_map[i j].append(val) result [] for d in range(len(diagonal_map)): result.extend(reversed(diagonal_map[d])) return resultJava 实现public int[] findDiagonalOrder(ListListInteger nums) { MapInteger, ListInteger diagonalMap new LinkedHashMap(); for (int i 0; i nums.size(); i) { for (int j 0; j nums.get(i).size(); j) { int key i j; diagonalMap.putIfAbsent(key, new ArrayList()); diagonalMap.get(key).add(nums.get(i).get(j)); } } ListInteger result new ArrayList(); int d 0; while (diagonalMap.containsKey(d)) { ListInteger diagonal diagonalMap.get(d); for (int i diagonal.size() - 1; i 0; i--) { result.add(diagonal.get(i)); } d; } return result.stream().mapToInt(Integer::intValue).toArray(); }边界情况处理空数组当 nums 为空时应该返回空结果。代码会正确处理因为外层循环不会执行。只有一个元素当只有一个元素时如 [[5]]对角线索引为 0 的列表包含 [5]反转后仍然是 [5]。每行元素数量不同代码正确处理了每行元素数量不同的情况因为内层循环遍历每行的实际元素。单行数组当只有一行时如 [[1, 2, 3]]每条对角线只有一个元素输出顺序就是 [1, 2, 3]。测试用例def test_find_diagonal_order(): assert findDiagonalOrder([[1,2,3],[4,5,6],[7,8,9]]) [1,4,2,7,5,3,8,6,9] assert findDiagonalOrder([[1,2,3],[4,5,6]]) [1,4,2,5,3] assert findDiagonalOrder([[1],[2],[3]]) [1,2,3] assert findDiagonalOrder([[1]]) [1] assert findDiagonalOrder([]) [] assert findDiagonalOrder([[1,2,3,4,5]]) [1,2,3,4,5] print(所有测试用例通过)扩展问题使用 Counter可以使用 collections.Counter 来代替手动创建哈希表from collections import defaultdict def findDiagonalOrder_counter(nums): diagonal defaultdict(list) for i, row in enumerate(nums): for j, val in enumerate(row): diagonal[i j].append(val) result [] for d in sorted(diagonal.keys()): result.extend(reversed(diagonal[d])) return result返回对角线的起始位置如果题目要求返回每个对角线的起始位置或统计信息可以修改代码收集额外信息。总结对角线遍历 II 问题展示了前缀和对角线索引在分组和排序中的应用。通过使用 i j 作为键我们将同一条对角线的元素分组然后反转顺序输出。这个问题虽然不直接涉及区间求和但它利用了前缀和的差值相同性质来识别同一条对角线。希望通过本文的讲解读者能够理解前缀和概念的更广泛应用并将其推广到更多类似问题的解决中。
http://www.zskr.cn/news/1361944.html

相关文章:

  • 2026年Q2四川应急物资厂家评测:应急消防设备厂家/应急物资厂家电话/抗洪抢险应急设备/消防工具厂家/消防智能设备/选择指南 - 优质品牌商家
  • 2026成都靠谱金属建材回收公司推荐:工厂废料回收/工地废料回收/库房物资回收/废旧机器回收/废铁回收/废铜回收/选择指南 - 优质品牌商家
  • 2026年Q2西南地区测绘仪租赁服务机构排行盘点:华测rtk/华测无人船/地形测量/大疆无人机/徕卡全站仪/手持扫描仪/选择指南 - 优质品牌商家
  • 面向创意生成 Agent 的 Harness 随机种子管理
  • 2026年当下河北工程网格布实力厂商剖析与精准选型指南 - 2026年企业推荐榜
  • 2026气体扩散层权威供应商精选推荐:气体扩散过滤板、气体扩散金属板、气体扩散钛板、气体扩散钛滤板、电解槽滤板选择指南 - 优质品牌商家
  • 零售智能体上线周期缩短至11天,如何复用这3套经GDPR+等保三级认证的Agent模板?
  • AI Agent Harness Engineering 在房地产中的应用:智能推荐与价值评估
  • 国曙GOSHINE正式亮相:一家人力资源服务机构的“长期主义”转向!
  • 学 Simulink—— 双定子永磁同步电机(DS‑PMSM)的协同控制与转矩提升仿真(带 MATLAB 脚本(直接运行))
  • 首个「音频-视觉智能」综述:大模型时代的AVI,究竟走到哪一步了?
  • 2026年5月新发布:Shiwosi史沃斯以工业级硬实力重塑车间清洁标准 - 2026年企业推荐榜
  • 黄仁勋放话:AI基建要烧掉4万亿美元 谁买单?
  • React 性能优化:从 3 秒卡顿到 60 帧流畅,我做了这 5 件事
  • 【能源AI Agent价值验证白皮书】:实测降低风电场故障预测误报率63%,缩短停机决策时间至8.2分钟
  • 2026年Q2国内矿箱厂家实力排行及联系方式参考:集装箱卫生间/集装箱售卖亭/集装箱售楼部/集装箱房屋厂家联系电话/选择指南 - 优质品牌商家
  • 加速科研、提出新假设:谷歌重磅推出Co-Scientist模型
  • 毕业论文神器!2026年必备AI论文软件榜单,免费版也能写合规初稿
  • 股权纠纷律师哪个好?陈杰律师:最高院再审胜诉经验 - 外贸老黄
  • 微服务安全防护实战:OAuth2与JWT鉴权
  • JWT令牌安全实践详解
  • Go语言错误处理:最佳实践
  • Go语言注释规范:代码即文档
  • 某聘 app sig/sp/响应体 unidbg分析
  • 3分钟解决Mac与Windows文件交换难题:Nigate免费NTFS读写工具完全指南
  • 2026年当前,如何甄选优质自行车厂家?以途锐达为例深度解析 - 2026年企业推荐榜
  • 一体化压铸:概念满天飞,真正能量产大铸件的厂到底有几家
  • 企业级条码处理方案:ZXing.Net在.NET生态中的架构实践与性能优化
  • 2026年国内可靠消泡剂供应商TOP5盘点:反渗透清洗剂/反渗透絮凝剂/反渗透药剂/反渗透还原剂/反渗透阻垢剂/选择指南 - 优质品牌商家
  • 【深度解析】用行为约束提升 AI Coding Agent:从 nine arm skills 看工程化智能体工作流设计