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

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)
http://www.jsqmd.com/news/755437/

相关文章:

  • 构建高效开发工具集:从环境配置到Docker部署的工程实践
  • 2942. 查找包含给定字符的单词
  • 新手入门:通过快马生成可交互代码,轻松理解exfat与ntfs核心差异
  • SD3012 磁编码器芯片新手快速上手指南
  • CrewAI的“万星”神话:是资本造假,还是真的好用?
  • Java协议解析核心源码深度剖析(Netty+Spring Boot双栈实测):JDK底层ByteBuf与ProtocolBuffer序列化链路全曝光
  • 别再只懂TMR了!聊聊Xilinx FPGA在太空里抗辐射的几种“保命”招数
  • L9110S电机驱动模块的4种电平组合全解析:别再让你的小车原地打转了
  • 新手入门Web开发:借助快马平台AI生成你的第一个免费美剧网站
  • 普通车床变速箱的三维虚拟设计及运动仿真
  • 5大核心特性深度解析:Bebas Neue字体的技术革新与实战价值
  • 为什么92%的医疗PHP系统仍在用MD5做脱敏?,一文讲透国密SM4+动态盐值的合规替代方案
  • nodejs实战:基于快马平台快速构建可部署的实时聊天室应用系统
  • 打造安全的礼物天堂:专业安全策略揭秘
  • 免费音频转换器fre:ac:终极跨平台音频处理解决方案
  • 保姆级教程:用QT Creator和C++给你的Arduino/STM32做个带串口控制的LED上位机
  • Linux服务器路径部署建议
  • 提升iic调试效率:用快马ai生成总线监控与从机模拟工具
  • 华为手机抓蓝牙包踩坑记:USB连接模式不调对,adb pull 永远拿不到btsnoop_hci.log
  • NewsMCP:基于MCP协议与AI聚类的实时新闻服务器,赋能AI智能体
  • IQ-Learn 在 RTX 3090 服务器上的环境配置与踩坑记录
  • 告别信号模糊:手把手教你理解PCIe 3.0的动态均衡(含FIR滤波器配置)
  • 避坑指南:在MATLAB里跑YOLOv5目标检测,从模型转换到界面集成的5个常见问题
  • 开源工具 compromising-position:自动化网络暴露面测绘与风险识别实战指南
  • 解析钻石依赖问题与并发版本控制技术
  • CoPaw-ACTS基准:多智能体协作算法的评估利器与实践指南
  • 借助审计日志功能追踪与管理API Key的使用情况
  • Windows 系统
  • Model Context Protocol (MCP) 深度解析:构建 AI Agent 的标准化“数据插槽”
  • 在统信UOS和麒麟V10上,用Qt和VLC-Qt打造你的专属媒体播放器(ARM/X86双架构实测)