LeetCode 3068.最大节点价值之和:脑筋急转弯+动态规划(O(1)空间)

【LetMeFly】3068.最大节点价值之和:脑筋急转弯+动态规划(O(1)空间)

力扣题目链接:https://leetcode.cn/problems/find-the-maximum-sum-of-node-values/

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

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

  • 选择连接节点 u 和 v 的边 [u, v] ,并将它们的值更新为:
    <ul><li><code>nums[u] = nums[u] XOR k</code></li><li><code>nums[v] = nums[v] XOR k</code></li>
    </ul>
    </li>
    

请你返回 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 是可以得到最大的价值之和。

示例 3:

输入:nums = [7,7,7,7,7,7], k = 3, edges = [[0,1],[0,2],[0,3],[0,4],[0,5]]
输出:42
解释:Alice 不需要执行任何操作,就可以得到最大价值之和 42 。

 

提示:

  • 2 <= n == nums.length <= 2 * 104
  • 1 <= k <= 109
  • 0 <= nums[i] <= 109
  • edges.length == n - 1
  • edges[i].length == 2
  • 0 <= edges[i][0], edges[i][1] <= n - 1
  • 输入保证 edges 构成一棵合法的树。

挺有意思的题

解题方法:动态规划

推导一

前提:

  1. 一个数异或 k k k两次相当于没异或
  2. 选择树中一条路径上的所有边,相当于只有路径两端的两个元素异或了 k k k(中间每个元素都会异或 k k k两次)
  3. 树上任意两点之间存在一条路径

结论:

  1. 相当于我可以从 n u m s nums nums数组中任选两个数异或,实际上我连边都有哪些都不用管,edges数组直接删!

推导二

前提:

  1. 每次操作都会作用两个数

    1. 如果操作前两个数都异或过,操作后相当于两个数都没异或过
    2. 如果操作前两个数都没异或过,操作后相当于两个数都异或过
    3. 如果操作前两个数一个异或过一个没异或过,操作后相当于两个数一个没异或过一个异过

结论:

  1. 无论操作多少次,都相当于有偶数个数被异或了

解题思路

我们可以使用动态规划数组 o d d [ i ] odd[i] odd[i]代表 n u m s nums nums i i i个数中有奇数个被异或过的元素最大和, e v e n [ i ] even[i] even[i]代表 n u m s nums nums i i i个数中有偶数个被异或过的元素最大和。

对于一个数 n u m s [ i ] nums[i] nums[i],可以选择也可以不选,对应

o d d [ i ] = max ⁡ ( o d d [ i ] + n u m s [ i ] , e v e n [ i ] + ( n u m s [ i ] ^ k ) ) odd[i]=\max(odd[i]+nums[i], even[i]+(nums[i]\verb|^|k)) odd[i]=max(odd[i]+nums[i],even[i]+(nums[i]^k))

e v e n [ i ] = max ⁡ ( e v e n [ i ] + n u m s [ i ] , o d d [ i ] + ( n u m s [ i ] ^ k ) ) even[i]=\max(even[i]+nums[i], odd[i]+(nums[i]\verb|^|k)) even[i]=max(even[i]+nums[i],odd[i]+(nums[i]^k))

当然也可以原地滚动优化空间。

时空复杂度分析

  • 时间复杂度 O ( l e n ( n u m s ) ) O(len(nums)) O(len(nums))
  • 空间复杂度 O ( 1 ) O(1) O(1)

AC代码

C++
/** @Author: LetMeFly* @Date: 2025-05-27 23:28:05* @LastEditors: LetMeFly.xyz* @LastEditTime: 2025-05-27 23:34:08*/
typedef long long ll;class Solution {
public:ll maximumValueSum(vector<int>& nums, int k, vector<vector<int>>& edges) {ll odd = LLONG_MIN, even = 0;for (int t : nums) {ll newO = max(odd + t, even + (t ^ k));ll newE = max(even + t, odd + (t ^ k));odd = newO, even = newE;}return even;}
};
Python
'''
Author: LetMeFly
Date: 2025-05-27 23:28:05
LastEditors: LetMeFly.xyz
LastEditTime: 2025-05-27 23:40:11
'''
from typing import Listclass Solution:def maximumValueSum(self, nums: List[int], k: int, edges: List[List[int]]) -> int:odd, even = -100000000000000, 0for t in nums:odd, even = max(odd + t, even + (t ^ k)), max(even + t, odd + (t ^ k))return even
Java
/** @Author: LetMeFly* @Date: 2025-05-27 23:28:05* @LastEditors: LetMeFly.xyz* @LastEditTime: 2025-05-27 23:45:06*/
class Solution {public long maximumValueSum(int[] nums, int k, int[][] edges) {long even = 0, odd = -1000000000000000L;  // 记得带“L”for (int t : nums) {long newO = Math.max(odd + t, even + (t ^ k));long newE = Math.max(even + t, odd + (t ^ k));odd = newO;even = newE;}return even;}
}
Go
/** @Author: LetMeFly* @Date: 2025-05-27 23:28:05* @LastEditors: LetMeFly.xyz* @LastEditTime: 2025-05-27 23:49:20*/
package mainfunc maximumValueSum(nums []int, k int, edges [][]int) int64 {odd, even := int64(-10000000000000000), int64(0)  // -1...0也可能是intfor _, t := range nums {odd, even = max(odd + int64(t), even + int64(t ^ k)), max(even + int64(t), odd + int64(t ^ k))}return even
}

同步发文于CSDN和我的个人博客,原创不易,转载经作者同意后请附上原文链接哦~

千篇源码题解已开源

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.pswp.cn/web/81616.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

HTTPS加密通信详解及在Spring Boot中的实现

HTTPS&#xff08;Hyper Text Transfer Protocol Secure&#xff09;是HTTP的安全版本&#xff0c;通过SSL/TLS协议为通讯提供加密、身份验证和数据完整性保护。 一、HTTPS核心原理 1.加密流程概述 客户端发起HTTPS请求&#xff08;连接到服务器443端口&#xff09;服务器返…

解决线程安全问题

前言 昨天学习了如何去解决线程不安全的问题。一般方法都是通过加锁来处理&#xff0c;跟大家分享一波 。 解决线程安全问题 结语 希望可以帮助到大家~ byebye

网络常识:网线和光纤的区别

网络常识&#xff1a;网线和光纤的区别 一. 介绍二. 网线2.1 什么是网线&#xff1f;2.2 网线的主要类别2.3 网线的优势2.4 网线的劣势 三. 光纤3.1 什么是光纤&#xff1f;3.2 光纤的主要类别3.3 光纤的优势3.4 光纤的劣势 四. 网线 vs 光纤&#xff1a;谁更适合你&#xff1f…

win11 禁用/恢复 内置笔记本键盘(保证管用)

文章目录 禁用启用 禁用 1&#xff09;按下 win x&#xff0c;点击 设备管理器 2&#xff09;拔掉所有笔记本外设&#xff08;一定要都拔掉&#xff0c;不然后面禁用设备会混淆&#xff09;&#xff0c;然后右键点击 键盘 > HID Keyboard Device 2&#xff09;点击 更新…

Three.js搭建小米SU7三维汽车实战(5)su7登场

汽车模型加载 我们在sktechfab上下载的汽车是glb的文件格式&#xff0c;所以使用gltfLoader进行加载。这里将小车直接加载进来看看效果&#xff1b; import { GLTFLoader } from "three/addons/loaders/GLTFLoader.js"; ....其余代码省略 const gltfLoader new GLT…

ETL怎么实现多流自定义合并?

随着信息技术的迅猛发展以及数据生成环境的多样化&#xff0c;互联网、物联网和社交媒体的广泛应用导致各种设备和平台不断产生大量数据&#xff0c;需要整合这些数据&#xff0c;从而进行数据融合。数据集成和管理平台ETLCloud&#xff0c;主要用于支持数据的抽取&#xff08;…

数据结构- 10种常见树:二叉树、平衡二叉树、完全二叉树

一、树 树型结构是一类重要的非线性数据结构。其中以树和二叉树最为常用&#xff0c;直观看来&#xff0c;树是以分支关系定义的层次结构。把它叫做“树”是因为它常看起来像一棵倒挂的树&#xff0c;也就是说它常是根朝上&#xff0c;而叶朝下的。 1.树的定义&#xff1a; 树…

Java常用加密方式

一&#xff0c;加密算法分类 对称加密&#xff1a;指加密和解密的密钥相同&#xff0c;优点就是加解密的效率高且易于实现。 非对称加密&#xff1a;指加密和解密的密钥不相同&#xff0c;也称为公私要加密。 不可逆加密&#xff1a;特征就是加密过程不需要密钥&#xff0c;…

SQLite软件架构与实现源代码浅析

概述 SQLite 是一个用 C 语言编写的库&#xff0c;它成功打造出了一款小型、快速、独立、具备高可靠性且功能完备的 SQL 数据库引擎。本文档将为您简要介绍其架构、关键组件及其协同运作模式。 SQLite 显著特点之一是无服务器架构。不同于常规数据库&#xff0c;它并非以单独进…

让 Deepseek GPS测速

下面是一个简单的微信小程序GPS测速功能的实现代码&#xff0c;包括前端页面和后端逻辑。 1. 页面结构 (index.wxml) <view class"container"><view class"speed-display"><text class"speed-value">{{speed}}</text>…

什么是软件的生命周期,以及常见的开发测试模型

目录 一、软件的生命周期 1、什么是生命周期&#xff1f; 2、每个阶段都要做些什么&#xff1f; 二、常见的开发模型 1、瀑布模型 2、螺旋模型 3、增量模型、迭代模型 4、敏捷模型 scrum模型 三个角色 五个会议 一、软件的生命周期 1、什么是生命周期&#xff…

JWT安全:弱签名测试.【实现越权绕过.】

JWT安全&#xff1a;假密钥【签名随便写实现越权绕过.】 JSON Web 令牌 (JWT)是一种在系统之间发送加密签名 JSON 数据的标准化格式。理论上&#xff0c;它们可以包含任何类型的数据&#xff0c;但最常用于在身份验证、会话处理和访问控制机制中发送有关用户的信息(“声明”)。…

数据分析与应用-----使用scikit-learn构建模型

目录 一、使用sklearn转换器处理数据 &#xff08;一&#xff09;、加载datasets模块中的数据集 &#xff08;二&#xff09;、将数据集划分为训练集和测试集 ​编辑 train_test_spli &#xff08;三&#xff09;、使用sklearn转换器进行数据预处理与降维 PCA 二、 构…

【Tomcat】Tomcat端口仅允许本地访问设置方法

要设置Tomcat端口仅允许本地访问&#xff0c;可以通过以下两种主要方式实现&#xff1a; 方法一&#xff1a;修改Tomcat配置文件&#xff08;推荐&#xff09; 修改 server.xml 文件 打开Tomcat的配置文件 conf/server.xml&#xff0c;找到 <Connector> 标签&#xff08;…

arcgis字段计算器中计算矢量面的每个点坐标

python脚本 函数 def ExportCoordinates(feat):coors = []partnum = 0partcount = feat.partCountwhile partnum < partcount:part = feat.getPart(partnum)pnt = part.next()while pnt:coors.append("({}, {})".format(pnt.X,pnt.Y))pnt = part.next()if not p…

企业级AI开启落地战,得场景者得天下

文&#xff5c;白 鸽 编&#xff5c;王一粟 这两周&#xff0c;企业级智能体开发平台颇有你方唱罢我方登台的架势。 微软、腾讯、网易等国内外巨头&#xff0c;近期都相继宣布推出了新一代智能体开发平台。相比于两年前&#xff0c;智能体开发的产品逻辑已经有了翻天覆地的变…

探索C++标准模板库(STL):String接口实践+底层的模拟实现(中篇)

前引&#xff1a;上一篇文章小编已经整理出了String的常用接口&#xff0c;梳理了各个接口的功能、参数&#xff0c;如何使用等各种实例。本篇文章将带大家看看String这些接口的实践使用&#xff0c;探索这些接口的实用性&#xff0c;是如何增加代码效率的。在本篇文章的末尾&a…

【模型显著性分析】配对样本 t 检验

写在前面&#xff1a;本博客仅作记录学习之用&#xff0c;部分图片来自网络&#xff0c;如需引用请注明出处&#xff0c;同时如有侵犯您的权益&#xff0c;请联系删除&#xff01; 文章目录 前言 t t t 检验配对样本 t t t 检验&#xff08;适用于相关组&#xff09;代码论文描…

商旅平台排名:十大商旅服务平台解析

商旅平台排名&#xff1a;十大商旅服务平台解析 在企业降本增效的关键转型期&#xff0c;商旅管理正成为优化运营成本与提升管理效能的核心场景。如何在保障出行体验的同时实现差旅成本精细化管控、管理流程智能化&#xff0c;成为越来越多企业的战略焦点。随着AI技术在数据洞…

题海拾贝:P1208 [USACO1.3] 混合牛奶 Mixing Milk

Hello大家好&#xff01;很高兴我们又见面啦&#xff01;给生活添点passion&#xff0c;开始今天的编程之路&#xff01; 我的博客&#xff1a;<但凡. 我的专栏&#xff1a;《编程之路》、《数据结构与算法之美》、《题海拾贝》、《C修炼之路》 欢迎点赞&#xff0c;关注&am…