最大连续子数组的和:解题分析与多种方法对比
题目描述
给定一个整数数组 nums,你可以从数组中删除任意数量的元素,但不能将其变为空数组。删除操作后,选出一个子数组,使得子数组中的元素互不相同,并且该子数组的元素和最大。返回该子数组的最大元素和。
约束:
- 子数组是数组的一个连续、非空的元素序列。
- 元素不能重复。
- 你可以删除任意数量的元素,但不能删除所有元素。
解题分析
这道题目的主要挑战是如何确保:
- 选择的子数组连续。
- 子数组中的元素是互不相同的。
- 选出的子数组的元素和最大。
题目的要求显然强调了数组的连续性和互不相同,这使得解题方法需要既能处理连续性,又能处理重复元素的问题。
思路:删除负数后直接求和
在处理这类题目时,一种简单而有效的解法是直接从数组中删除负数,并计算剩余正数的和。如果数组中有正数,则返回它们的和。如果数组没有正数,则返回最大负数。这个方法简单直接,且在许多情况下非常高效。
代码实现:
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) |
简单直接,代码简洁 |
总结
最优解法:
在这道题目中,删除负数后求和的解法是最为简洁且高效的。通过去除负数,并去重剩余的正数,能够快速得到符合题目要求的最大和。这种方法不仅符合“子数组连续性”的要求,同时还能有效地避免重复元素。
最终解法:
如果题目没有特别要求“子数组必须连续”,可以考虑去掉负数并计算剩余正数的和,但注意这在某些边界情况下可能不适用。对于复杂的输入,滑动窗口方法虽然直观,但需要更多的处理来确保元素的连续性和去重,因此这种方法在本题中不推荐。
希望这篇博客对你解答这道题目有所帮助。如果你有其他问题或进一步的疑问,欢迎留言交流!

被折叠的 条评论
为什么被折叠?



