news 2026/7/4 7:23:55

Kimi LeetCode 3425. 最长特殊路径 Python3实现

作者头像

张小明

前端开发工程师

1.2k 24
文章封面图
Kimi LeetCode 3425. 最长特殊路径 Python3实现

以下是 LeetCode 3425. 最长特殊路径 的 Python3 实现。

---

解题思路

这道题的核心是 DFS + 滑动窗口(树上的双指针),时间复杂度 O(n),空间复杂度 O(n)。

关键观察

1. 特殊路径的定义:路径上所有节点的值互不相同。这等价于"无重复元素的最长子数组"问题在树上的扩展。

2. 为什么用滑动窗口? 从根节点出发 DFS,维护当前路径上的节点值集合。当遇到重复值时,需要收缩左边界,直到没有重复值为止。这和数组上的"无重复元素最长子数组"问题本质相同。

3. 具体实现:
- `prefix` 数组:记录从根到当前节点的路径长度前缀和,`prefix[i]` 表示深度为 `i` 的节点到根的路径长度
- `lastSeenDepth`:字典,记录每个节点值最后出现的深度
- `leftBoundary`:当前窗口的左边界深度,确保 `[leftBoundary, currentDepth]` 内无重复值

4. 路径长度计算:`length = prefix[currentDepth] - prefix[leftBoundary]`,节点数 = `currentDepth - leftBoundary`

---

Python3 完整代码

```python
from typing import List

class Solution:
def longestSpecialPath(self, edges: List[List[int]], nums: List[int]) -> List[int]:
n = len(nums)

# 建图:邻接表,存储 (邻居节点, 边权)
graph = [[] for _ in range(n)]
for u, v, w in edges:
graph[u].append((v, w))
graph[v].append((u, w))

# 答案变量
maxLength = 0
minNodes = 1

# prefix[i] = 从根节点到深度为 i 的节点的路径长度
prefix = [0]

# lastSeenDepth[val] = 节点值 val 最后出现的深度
lastSeenDepth = {}

def dfs(u: int, prev: int, leftBoundary: int) -> None:
nonlocal maxLength, minNodes

# 记录当前节点值之前出现的深度
prevDepth = lastSeenDepth.get(nums[u], 0)

# 更新当前节点值的最后出现深度
lastSeenDepth[nums[u]] = len(prefix)

# 收缩左边界:确保 [leftBoundary, currentDepth] 内无重复值
leftBoundary = max(leftBoundary, prevDepth)

# 计算当前路径的长度和节点数
length = prefix[-1] - prefix[leftBoundary]
nodes = len(prefix) - leftBoundary

# 更新答案:优先更长路径,长度相同时更少节点数
if length > maxLength or (length == maxLength and nodes < minNodes):
maxLength = length
minNodes = nodes

# 遍历所有子节点
for v, w in graph[u]:
if v == prev:
continue

# 将子节点加入路径
prefix.append(prefix[-1] + w)
dfs(v, u, leftBoundary)
prefix.pop() # 回溯

# 回溯:恢复当前节点值的最后出现深度
lastSeenDepth[nums[u]] = prevDepth

# DFS 从根节点 0 开始
dfs(0, -1, 0)

return [maxLength, minNodes]
```

---

测试验证

输入 输出 说明
`edges=[[0,1,2],[1,2,3],[1,3,5],[1,4,4],[2,5,6]], nums=[2,1,2,1,3,1]` `[6, 2]` 最长路径 2→5(长度6,2个节点)和 0→1→4(长度6,3个节点),取最少节点数 2
`edges=[[1,0,8]], nums=[2,2]` `[0, 1]` 两节点值相同,只能选单个节点
`edges=[], nums=[5]` `[0, 1]` 单节点
`edges=[[0,1,1],[1,2,1],[2,3,1]], nums=[1,2,3,4]` `[3, 4]` 链状树,无重复值
`edges=[[0,1,1],[0,2,1],[1,3,1],[1,4,1]], nums=[1,2,1,3,4]` `[2, 3]` 有重复值需要收缩窗口

下载完整代码:[leetcode_3425.py](sandbox:///mnt/agents/output/leetcode_3425.py)

版权声明: 本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若内容造成侵权/违法违规/事实不符,请联系邮箱:809451989@qq.com进行投诉反馈,一经查实,立即删除!
网站建设 2026/7/4 1:58:35

北方高寒矿区专网通信搭建要点,适配低温、粉尘、防爆严苛工况

北方工矿矿区常年低温严寒、风沙粉尘大、作业环境复杂&#xff0c;井下开采、露天采掘、物料转运、设备检修、应急值守等工作24小时不间断开展。矿区属于高危作业场景&#xff0c;对通信设备的防爆、防寒、防尘、抗干扰性能要求极高&#xff0c;普通民用对讲设备无法适配矿区严…

作者头像 李华
网站建设 2026/7/4 6:06:22

别再只会Ctrl+Alt+T了!VMware Workstation 17 Pro里这5个隐藏指令,效率翻倍

VMware Workstation 17 Pro高阶指令指南&#xff1a;解锁专业用户的效率密码在虚拟化技术的日常使用中&#xff0c;大多数用户停留在图形界面的基础操作层面&#xff0c;却不知道命令行工具中隐藏着能大幅提升工作效率的宝藏指令。对于每天需要管理多个虚拟机的开发者和运维人员…

作者头像 李华
网站建设 2026/7/4 7:20:53

第十三篇:工业边缘与汽车数据空间——“能力出园”的智能制造

车间胶囊与供应链联邦——DISC架构在机器轰鸣中的深度落地 一、工厂的“双重恐惧” 一家高端精密制造工厂&#xff0c;五轴CNC机床正在加工航空发动机叶片。主轴转速每分钟四万转&#xff0c;刀具与钛合金接触瞬间温度骤升到八百度。每秒钟&#xff0c;数十个传感器——振动、…

作者头像 李华
网站建设 2026/7/4 2:08:10

Platinum-MD:如何让20年前的MiniDisc设备在现代电脑上重获新生?

Platinum-MD&#xff1a;如何让20年前的MiniDisc设备在现代电脑上重获新生&#xff1f; 【免费下载链接】platinum-md Minidisc NetMD Conversion and Upload 项目地址: https://gitcode.com/gh_mirrors/pl/platinum-md 您是否有一台尘封已久的MiniDisc播放器&#xff0…

作者头像 李华
网站建设 2026/6/30 22:34:28

记一次 XSS Bypass 实战——当 WAF 拦住了你的

前言 在 Bugcrowd 上挖洞&#xff0c;最怕的不是找不到漏洞点&#xff0c;而是找到了漏洞点却被 WAF 无情拦截。本文记录一次某目标主站 XSS 漏洞的完整挖掘与 Bypass 过程&#xff0c;从寻找输入输出点到最终成功弹窗&#xff0c;希望能给正在做漏洞挖掘的师傅们一些思路。 一…

作者头像 李华