3487. 删除后的最大子数组元素和

最大连续子数组的和:解题分析与多种方法对比

题目描述

给定一个整数数组 nums,你可以从数组中删除任意数量的元素,但不能将其变为空数组。删除操作后,选出一个子数组,使得子数组中的元素互不相同,并且该子数组的元素和最大。返回该子数组的最大元素和。

约束:

  1. 子数组是数组的一个连续、非空的元素序列。
  2. 元素不能重复。
  3. 你可以删除任意数量的元素,但不能删除所有元素。

解题分析

这道题目的主要挑战是如何确保:

  • 选择的子数组连续
  • 子数组中的元素是互不相同的。
  • 选出的子数组的元素和最大

题目的要求显然强调了数组的连续性互不相同,这使得解题方法需要既能处理连续性,又能处理重复元素的问题。

思路:删除负数后直接求和

在处理这类题目时,一种简单而有效的解法是直接从数组中删除负数,并计算剩余正数的和。如果数组中有正数,则返回它们的和。如果数组没有正数,则返回最大负数。这个方法简单直接,且在许多情况下非常高效。

代码实现:
class Solution:
    def maxSum(self, nums: List[int]) -> int:
        st = set(x for x in nums if x >= 0)  # 删除负数,去重
        return sum(st) if st else max(nums)  # 如果有正数,则返回正数和;否则返回最大负数
复杂度分析:
  • 时间复杂度:O(n),其中 n 是数组的长度。我们只遍历一次数组来构造集合 st,然后计算其和。
  • 空间复杂度:O(n),集合 st 最多包含所有正数。
示例说明:

对于数组 nums = [4, 2, 4, 5, 6]

  • 删除负数后,剩下的正数是 [4, 2, 4, 5, 6],去重后变成 {4, 2, 5, 6}
  • 返回这些数的和:4 + 2 + 5 + 6 = 17

对于数组 nums = [-1, -2, -3]

  • 所有数都是负数,因此返回最大负数 -1

解法比较:

解法

时间复杂度

空间复杂度

优点

删除负数法

O(n)

O(n)

简单直接,代码简洁

总结

最优解法:

在这道题目中,删除负数后求和的解法是最为简洁且高效的。通过去除负数,并去重剩余的正数,能够快速得到符合题目要求的最大和。这种方法不仅符合“子数组连续性”的要求,同时还能有效地避免重复元素。

最终解法:

如果题目没有特别要求“子数组必须连续”,可以考虑去掉负数并计算剩余正数的和,但注意这在某些边界情况下可能不适用。对于复杂的输入,滑动窗口方法虽然直观,但需要更多的处理来确保元素的连续性去重,因此这种方法在本题中不推荐。


希望这篇博客对你解答这道题目有所帮助。如果你有其他问题或进一步的疑问,欢迎留言交流!

评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
红包 添加红包
表情包 插入表情
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值