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
繁體地址,請注明出處:http://hk.pswp.cn/web/81616.shtml
英文地址,請注明出處:http://en.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…