Leetcode 3068. Find the Maximum Sum of Node Values

本文介绍了如何通过巧妙利用异或操作解决LeetCode中的3068题,将问题转化为寻找最大累积增长,给出了Python代码实现并分析了其时间复杂度和内存占用情况。

1. 解题思路

这一题虽然标记为一道hard的题目,但其实就是一个脑筋急转弯的题目。

我们只需要想明白一点即可:

  • 由于异或操作满足x^y^y = x,对于一棵联通树,我们总可以通过有限次对相邻边地操作,使得任意两点(u, v)转变为(u^z, v^z),而其他所有的节点都不发生变化。

因此,我们只需要计算出所有点如果进行异或操作之后可以得到的改变量,然后将其从大到小进行排序,两两配对之后考察最大能够获得多少累积增长即可。

2. 代码实现

给出python代码实现如下:

class Solution:
    def maximumValueSum(self, nums: List[int], k: int, edges: List[List[int]]) -> int:
        delta = sorted([(x ^ k) - x for i, x in enumerate(nums)], reverse=True)
        i, n = 0, len(delta)
        ans = sum(nums)
        while i+1 < n and delta[i] + delta[i+1] > 0:
            ans += delta[i] + delta[i+1]
            i += 2
        return ans

提交代码评测得到:耗时972ms,占用内存28MB。

感谢您的指正。确实,在您提供的代码片段中,`maximum` 和 `maxIndex` 的初始值分别设置为 `-1` 和 `-1`。然而,这种初始化方式并不适用于所有情况,特别是当列表中包含非负整数或更大的数值时。为了确保代码的通用性和正确性,我建议根据具体情况进行初始化。 ### 解释初始化值的选择 1. **初始化为第一个元素**: - 这种做法可以确保无论列表中元素的取值范围如何,算法都能正常工作。 - 如果列表为空,可以在遍历前进行检查并返回适当的默认值(如 `None` 或其他约定的值)。 2. **初始化为固定值(如 `-1`)**: - 这种方法假设列表中的所有元素都大于 `-1`,但这并不总是成立,尤其是当列表中包含负数时。 - 使用固定值可能导致算法无法正确识别最大值,特别是在极端情况下。 ### 补充后的代码 如果您坚持使用 `-1` 作为初始值,以下是相应的代码实现,并附带了对空列表的处理: ```python def findMaximum(elements): # 检查列表是否为空 if not elements: return None, None # 如果列表为空,返回None # 初始化maximum和maxIndex为-1 maximum = -1 maxIndex = -1 # 遍历列表中的每个元素及其索引 for index, value in enumerate(elements): # 如果当前元素大于已记录的最大值或这是第一次比较 if value > maximum or maximum == -1: # 更新最大值和其索引 maximum = value maxIndex = index return maximum, maxIndex # 测试代码 elements = [3, 1, 4, 1, 5, 9] # 调用函数并接收返回值 maximum, maxIndex = findMaximum(elements) # 检查结果是否正确 if maximum == max(elements) and maxIndex == elements.index(max(elements)): print(f'Found maximum {maximum} at index {maxIndex}.') else: print('Something went wrong.') ``` ### 推荐做法 为了避免潜在的错误,推荐将`maximum`初始化为列表的第一个元素,这样可以确保算法在任何情况下都能正确工作: ```python def findMaximum(elements): # 检查列表是否为空 if not elements: return None, None # 如果列表为空,返回None # 初始化maximum为列表的第一个元素 maximum = elements[0] # 初始化maxIndex为第一个元素的索引 maxIndex = 0 # 遍历列表中的每个元素及其索引,从第二个元素开始 for index in range(1, len(elements)): # 如果当前元素大于已记录的最大值 if elements[index] > maximum: # 更新最大值和其索引 maximum = elements[index] maxIndex = index return maximum, maxIndex ``` ### 总结 1. **Python中的控制结构**:包括`if`条件语句用于逻辑判断,以及`for`循环用于迭代序列。 2. **Python函数和返回值**:函数可以接受输入参数并返回输出结果,通过`return`语句指定。 3. **Python列表操作**:包括访问列表元素、获取列表长度等基本操作。 如果您有更多问题或需要进一步的帮助,请随时告诉我!
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
红包 添加红包
表情包 插入表情
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值