DeepSeek LeetCode 3585. 树中找到带权中位节点 Python3实现

发布时间:2026/9/27 20:51:52

DeepSeek    LeetCode 3585. 树中找到带权中位节点 Python3实现
解题思路核心思想利用树上倍增LCA 二分跳跃在 O(log n) 时间内回答每个查询。1. 预处理· 以节点 0 为根DFS 计算每个节点的深度 depth[]、到根的距离 dist[]边权和以及倍增祖先表 parent[k][u]表示 u 的 2^k 级祖先。· 树中边权为正因此路径距离单调递增。2. 查询处理(u, v)· 若 u v答案就是 u。· 求 u 和 v 的 LCA l计算路径总权值 total dist[u] dist[v] - 2*dist[l]取半阈值 half (total 1) // 2向上取整。· 情况一中位节点在 u → l 这一段即 dist[u] - dist[l] half。从 u 向上跳找到最后一个满足 dist[u] - dist[ancestor] half 的祖先答案就是该祖先的父节点。· 情况二中位节点在 l → v 这一段。先计算 need half - (dist[u] - dist[l])表示从 l 向下还需走的权值。从 v 向上跳找到最浅最靠近 l的满足 dist[ancestor] - dist[l] need 的祖先该祖先即为答案。---Python3 实现pythonfrom typing import Listclass Solution:def findMedian(self, n: int, edges: List[List[int]], queries: List[List[int]]) - List[int]:# 建图邻接表adj [[] for _ in range(n)]for u, v, w in edges:adj[u].append((v, w))adj[v].append((u, w))LOG (n).bit_length() 1 # 倍增表大小parent [[-1] * n for _ in range(LOG)]depth [0] * ndist [0] * n# 迭代 DFS 预处理避免递归深度问题stack [(0, -1, 0, 0)] # (node, parent, depth, distance)while stack:u, p, d, w stack.pop()parent[0][u] pdepth[u] ddist[u] wfor v, wt in adj[u]:if v p:continuestack.append((v, u, d 1, w wt))# 构建倍增表for k in range(1, LOG):prev parent[k - 1]curr parent[k]for i in range(n):anc prev[i]curr[i] prev[anc] if anc ! -1 else -1# ---------- 辅助函数 ----------def kth_ancestor(u: int, k: int) - int:返回 u 的第 k 级祖先k 0若不存在返回 -1i 0while k:if k 1:u parent[i][u]if u -1:breakk 1i 1return udef lca(u: int, v: int) - int:返回 u 和 v 的最近公共祖先if depth[u] depth[v]:u, v v, u# 提升 u 至与 v 同深度u kth_ancestor(u, depth[u] - depth[v])if u v:return u# 一起向上跳for k in range(LOG - 1, -1, -1):if parent[k][u] ! parent[k][v]:u parent[k][u]v parent[k][v]return parent[0][u]def weighted_median(u: int, v: int) - int:if u v:return ul lca(u, v)total dist[u] dist[v] - 2 * dist[l]half (total 1) // 2 # 向上取整# 情况 1中位节点在 u - l 段if dist[u] - dist[l] half:cur ufor k in range(LOG - 1, -1, -1):nxt parent[k][cur]if nxt ! -1 and dist[u] - dist[nxt] half:cur nxtreturn parent[0][cur]# 情况 2中位节点在 l - v 段else:need half - (dist[u] - dist[l])cur vfor k in range(LOG - 1, -1, -1):nxt parent[k][cur]if (nxt ! -1 and depth[nxt] depth[l] anddist[nxt] - dist[l] need):cur nxtreturn cur# 处理所有查询return [weighted_median(u, v) for u, v in queries]---复杂度分析· 时间复杂度预处理 O(n log n)每个查询 O(log n)总复杂度 O((n q) log n)。· 空间复杂度邻接表 O(n)倍增表 O(n log n)总复杂度 O(n log n)。注意边权和路径总权值可能超过 32 位整数范围Python 的 int 无此限制无需额外处理。

相关新闻

免费AI编程助手:GPT-4级别性能的开发工具实战指南

免费AI编程助手:GPT-4级别性能的开发工具实战指南

2026/8/29 5:01:03

最近很多开发者都在问:现在有没有真正免费、稳定、还能体验接近 GPT-4 性能的 AI 工具?毕竟对于日常开发调试、代码生成、技术问题解答来说,动辄付费的 API 调用成本确实让人头疼。 如果你也在寻找这样的解决方案,那么这篇文章就…

C++电梯仿真系统:从面向对象设计到调度算法实现

C++电梯仿真系统:从面向对象设计到调度算法实现

2026/9/24 23:09:42

1. 项目概述与核心价值最近在整理过往的项目经验,发现一个挺有意思的课题:用C实现一个电梯仿真系统。这玩意儿乍一听像是学校里的课程设计,但真做下来,你会发现它是个绝佳的“麻雀虽小,五脏俱全”的练手项目。它几乎涵…

白鼠尾草、迷迭香、薰衣草:从材料鉴别到安全使用的完整指南

白鼠尾草、迷迭香、薰衣草:从材料鉴别到安全使用的完整指南

2026/9/26 16:44:21

这类工具最值得先看的不是功能列表,而是能不能在普通环境里稳定跑起来。白鼠尾草、迷迭香和薰衣草,听起来像是园艺或香氛材料,但在特定实践领域,它们常被当作基础工具来用。很多人拿到名字就急着找“最高效”的用法,结…

CANN/GE ACL数据集缓冲区添加函数

CANN/GE ACL数据集缓冲区添加函数

2026/9/26 19:14:12

aclmdlAddDatasetBuffer 【免费下载链接】ge GE(Graph Engine)是面向昇腾的图编译器和执行器,提供了计算图优化、多流并行、内存复用和模型下沉等技术手段,加速模型执行效率,减少模型内存占用。 GE 提供对 PyTorch、Te…

用ffmpeg高效批量调整图片尺寸的实战指南

用ffmpeg高效批量调整图片尺寸的实战指南

2026/9/27 1:30:29

/* MD / 富文本中的 .toc(含博客园搬家等嵌套结构);.toc-box 在侧栏,不受影响 */#content_views .toc,/* 编辑器常在目录前后插入空 p(:empty 仍占 20px),一并去掉避免顶空隙 */#content_views.markdown_views > p:empty:has(+ .toc),#content_views.markdown_views …

Transformers 音频特征提取工具库 audio_utils 全解析:从 Mel 刻度换算到对数 Mel 频谱

Transformers 音频特征提取工具库 audio_utils 全解析:从 Mel 刻度换算到对数 Mel 频谱

2026/9/27 1:30:37

Transformers 音频特征提取工具库 audio_utils 全解析:从 Mel 刻度换算到对数 Mel 频谱 【免费下载链接】transformers 🤗 Transformers: the model-definition framework for state-of-the-art machine learning models in text, vision, audio, and mu…

RustFS 多节点集群重启与滚动升级实战:Readiness、Quorum 与 Degraded 模式完全指南

RustFS 多节点集群重启与滚动升级实战:Readiness、Quorum 与 Degraded 模式完全指南

2026/9/27 1:30:35

RustFS 多节点集群重启与滚动升级实战:Readiness、Quorum 与 Degraded 模式完全指南 【免费下载链接】rustfs 🚀2.3x faster than MinIO for 4KB object payloads. RustFS is an open-source, S3-compatible high-performance object storage system sup…

Java Integer缓存揭秘:128陷阱原理、避坑与面试全解

Java Integer缓存揭秘:128陷阱原理、避坑与面试全解

2026/9/27 1:30:34

/* MD / 富文本中的 .toc(含博客园搬家等嵌套结构);.toc-box 在侧栏,不受影响 */#content_views .toc,/* 编辑器常在目录前后插入空 p(:empty 仍占 20px),一并去掉避免顶空隙 */#content_views.markdown_views > p:empty:has(+ .toc),#content_views.markdown_views …

RustFS Scanner 数据用量发布权威性决策:配额准入如何获得可用的权威依据

RustFS Scanner 数据用量发布权威性决策:配额准入如何获得可用的权威依据

2026/9/26 16:36:51

RustFS Scanner 数据用量发布权威性决策:配额准入如何获得可用的权威依据 【免费下载链接】rustfs 🚀2.3x faster than MinIO for 4KB object payloads. RustFS is an open-source, S3-compatible high-performance object storage system supporting mi…

远程协作的工作台整理

远程协作的工作台整理

2026/9/26 14:29:04

远程协作的工作台整理远程协作的核心不是再加一个工具,而是让交接信息足够完整。异步任务要写明目标、输入位置、完成标准和需要决策的人。 工作台的最小配置 将日程、待办、代码和沟通入口收拢到少数固定位置;通知按紧急程度分层。工作台不需要模仿办公…

持续集成 流水线自动化与 声明式交付 实践:原型怎样变成可用功能

持续集成 流水线自动化与 声明式交付 实践:原型怎样变成可用功能

2026/9/26 13:57:22

持续集成 流水线自动化与 声明式交付 实践:原型怎样变成可用功能分类:[AI/大模型]细分主题:AI 增强型 CI/CD 流水线自动化与 GitOps 实践:Agent 工作流、工具调用与任务拆解:从原型到生产的验收清单很多团队在尝试用大…

容器编排 生产环境运维与排障实战:复盘记录怎样真正派上用场

容器编排 生产环境运维与排障实战:复盘记录怎样真正派上用场

2026/9/26 23:35:16

容器编排 生产环境运维与排障实战:复盘记录怎样真正派上用场分类:[工程技术]细分主题:Kubernetes 生产环境运维与排障实战:可复制的项目复盘模板与决策记录大部分团队的事故复盘报告,最后都变成了躺在 Confluence 或钉…