news 2026/5/5 5:56:39

3068. 最大节点价值之和

作者头像

张小明

前端开发工程师

1.2k 24
文章封面图
3068. 最大节点价值之和

题目链接

3068. 最大节点价值之和 - 力扣(LeetCode)

题目描述

给你一棵n个节点的 无向 树,节点从0n - 1编号。树以长度为n - 1下标从 0 开始的二维整数数组edges的形式给你,其中edges[i] = [ui, vi]表示树中节点uivi之间有一条边。同时给你一个 正 整数k和一个长度为n下标从 0 开始的 非负 整数数组nums,其中nums[i]表示节点i的 价值 。

Alice 想 最大化 树中所有节点价值之和。为了实现这一目标,Alice 可以执行以下操作 任意 次:

  • 选择连接节点uv的边[u, v],并将它们的值更新为:
    • nums[u] = nums[u] XOR k
    • nums[v] = nums[v] XOR k

请你返回 Alice 通过执行以上操作 任意次 后,可以得到所有节点 价值之和 的 最大值 。

题目示例

示例 1 :

输入:nums = [1,2,1], k = 3, edges = [[0,1],[0,2]] 输出:6 解释:Alice 可以通过一次操作得到最大价值和 6 : - 选择边 [0,2] 。nums[0] 和 nums[2] 都变为:1 XOR 3 = 2 ,数组 nums 变为:[1,2,1] -> [2,2,2] 。 所有节点价值之和为 2 + 2 + 2 = 6 。 6 是可以得到最大的价值之和。

示例 2 :

输入:nums = [2,3], k = 7, edges = [[0,1]] 输出:9 解释:Alice 可以通过一次操作得到最大和 9 : - 选择边 [0,1] 。nums[0] 变为:2 XOR 7 = 5 ,nums[1] 变为:3 XOR 7 = 4 ,数组 nums 变为:[2,3] -> [5,4] 。 所有节点价值之和为 5 + 4 = 9 。 9 是可以得到最大的价值之和。

解题思路

  1. 问题描述
    • 给定一棵树(无向无环图),每个节点有一个整数值nums[i]
    • 可以对任意数量的节点进行异或操作:nums[i] ^= k
    • 目标是最大化整棵树的节点值之和。
  2. 关键观察
    • 异或操作是可逆的:对一个节点异或两次等于没有异或。
    • 最优解中,每个节点最多被异或一次。
    • 需要动态规划来记录每个节点是否被异或的最优解。
  3. 算法选择
    • 使用树形动态规划(DFS + DP)。
    • 对每个节点维护两个状态:
      • f0: 该节点未被异或时的子树最大和。
      • f1: 该节点被异或后的子树最大和。
    • 通过DFS遍历树,从叶子节点向上递推每个节点的f0f1
  4. 动态转移
    • 对于当前节点x,遍历其所有子节点y
    • 更新f0f1
      • f0可以是x未被异或 + 子节点y未被异或,或x未被异或 + 子节点y被异或。
      • f1可以是x被异或 + 子节点y未被异或,或x被异或 + 子节点y被异或。
    • 最终结果是max(f0, f1)

题解代码

classSolution{publiclongmaximumValueSum(int[]nums,intk,int[][]edges){intn=nums.length;// 构建邻接表表示的树结构List<Integer>[]g=newArrayList[n];Arrays.setAll(g,i->newArrayList<>());for(int[]e:edges){intx=e[0];inty=e[1];g[x].add(y);g[y].add(x);}// 从根节点0开始DFS,初始父节点为-1(表示无父节点)returndfs(0,-1,g,nums,k)[0];}privatelong[]dfs(intx,intfa,List<Integer>[]g,int[]nums,intk){// f0: 当前节点x未被异或时的最大值// f1: 当前节点x被异或后的最大值longf0=0;longf1=Long.MIN_VALUE;// 初始设为极小值,表示不可能的情况// 遍历所有子节点for(inty:g[x]){if(y!=fa){// 避免回到父节点// 递归处理子节点ylong[]r=dfs(y,x,g,nums,k);// 动态更新f0和f1:// t 表示当前节点x被异或的情况下,子节点y是否被异或的最优解longt=Math.max(f1+r[0],f0+r[1]);// 更新f0: 当前节点x未被异或的情况下,子节点y是否被异或的最优解f0=Math.max(f0+r[0],f1+r[1]);f1=t;}}// 返回结果:// [0]: 当前子树的最大和(x未被异或或x被异或)// [1]: 当前子树的最大和(x未被异或或x被异或)returnnewlong[]{Math.max(f0+nums[x],f1+(nums[x]^k)),Math.max(f1+nums[x],f0+(nums[x]^k))};}}

复杂度分析

  1. 时间复杂度
    • DFS遍历整棵树,每个节点被访问一次。
    • 对于每个节点,处理其所有子节点(树中边数为n-1,所以总操作数为O(n))。
    • 总时间复杂度:O(n)
  2. 空间复杂度
    • 邻接表存储树结构:O(n)
    • DFS递归栈深度:最坏情况下为树的高度,平均O(log n)(平衡树),最坏O(n)(链状树)。
    • 总空间复杂度:O(n)
版权声明: 本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若内容造成侵权/违法违规/事实不符,请联系邮箱:809451989@qq.com进行投诉反馈,一经查实,立即删除!
网站建设 2026/5/5 5:55:47

普通车床变速箱的三维虚拟设计及运动仿真

普通车床变速箱作为机械传动系统的核心部件&#xff0c;其设计质量直接影响加工精度与设备稳定性。三维虚拟设计通过数字化建模技术&#xff0c;将传统二维图纸转化为立体模型&#xff0c;使设计者能直观观察齿轮啮合、轴系布局等关键结构。这种可视化方式可提前发现干涉问题&a…

作者头像 李华
网站建设 2026/5/5 5:55:29

START框架:融合空间与文本的图表理解技术解析

1. 项目概述在数据可视化领域&#xff0c;图表理解一直是个既基础又复杂的任务。我们每天都会遇到各种图表——从简单的柱状图到复杂的热力图&#xff0c;但让机器真正"看懂"这些图表却并非易事。传统方法要么依赖纯视觉特征提取&#xff0c;要么单纯分析图表附带的文…

作者头像 李华
网站建设 2026/5/5 5:45:44

用自然语言管理特斯拉:Claude Code插件与tesla-cli架构解析

1. 项目概述&#xff1a;用自然语言管理你的特斯拉如果你和我一样&#xff0c;既是特斯拉车主&#xff0c;又是Claude Code的深度用户&#xff0c;那么你肯定幻想过这样一个场景&#xff1a;在写代码的间隙&#xff0c;随口问一句“我的车还有多少电&#xff1f;”&#xff0c;…

作者头像 李华
网站建设 2026/5/5 5:45:43

【三甲医院影像科认证引擎】:C++跨平台实时渲染框架开源前最后封测版(仅限本文读者限时获取)

更多请点击&#xff1a; https://intelliparadigm.com 第一章&#xff1a;【三甲医院影像科认证引擎】开源项目概览与临床价值定位 项目核心定位 【三甲医院影像科认证引擎】是一个面向医疗AI合规落地的开源框架&#xff0c;专为医学影像AI模型在真实临床场景中通过《人工智…

作者头像 李华
网站建设 2026/5/5 5:44:26

YOLOv11革新:RFAConv空间注意力机制助力目标检测精度飞跃

YOLO&#xff08;You Only Look Once&#xff09;系列算法在目标检测领域一直占据着重要的地位&#xff0c;以其高效和快速而闻名。然而&#xff0c;在实际应用中&#xff0c;尤其是在复杂场景下&#xff0c;YOLOv11 (假设存在) 仍然面临着一些挑战&#xff0c;例如小目标检测精…

作者头像 李华