删除子数组的最大得分-LeetCode
1695. 删除子数组的最大得分
🎯 问题描述(来源于LeetCode)
描述:
给你一个整数数组 nums。你需要从数组中删除一个含有若干不同元素的子数组(即子数组中不能有重复元素)。
删除子数组的得分是该子数组所有元素的和。
请你返回可以获得的最大得分。
说明:
-
这是一个不定长滑动窗口问题。
-
核心逻辑是维护一个“所有元素互不相同”的窗口。
-
当遇到重复元素时,收缩左边界,直到窗口内再次满足无重复条件。
-
与“无重复字符的最长子串”不同的是,这里优化的目标是元素和最大,而不是长度最长。
-
示例:
-
示例 1:
1 | 输入:nums = [4,2,4,5,6] |
- 示例 2:
1 | 输入:nums = [5,2,1,2,5,2,1,2,5] |
💻 解题思路
思路1:不定长滑动窗口
思路1:代码实现
1 | class Solution: |
思路1:📊 性能分析
- 时间复杂度:
- 其中 是数组
nums的长度。 - 虽然代码中有一个
while循环嵌套在for循环中,但每个元素最多被访问两次(一次被右边界right加入,一次被左边界left移出)。因此,整体操作次数是线性的。
- 其中 是数组
- 空间复杂度:
- 哈希表
count在最坏情况下(数组所有元素都不同)需要存储 个键值对。
- 哈希表
思考
-
与“最长无重复子串”的对比:
- 相同点:都使用滑动窗口维护“无重复元素”的条件,收缩逻辑完全一致(
while count[num] > 1)。 - 不同点:
- 最长子串问题更新的是
max(len)。 - 本题更新的是
max(sum)。
- 最长子串问题更新的是
- 因此,代码中多维护了一个变量
ans来实时计算窗口内的元素和。
- 相同点:都使用滑动窗口维护“无重复元素”的条件,收缩逻辑完全一致(
-
和的维护:
- 在扩展窗口时:
ans += num。 - 在收缩窗口时:
ans -= nums[left]。 - 这保证了
ans始终等于当前窗口[left, right]内所有元素的和。
- 在扩展窗口时:
-
结果更新:
result = max(ans, result)放在while循环之后。- 确保只有在窗口合法(无重复元素)时,才尝试更新最大得分。
本博客所有文章除特别声明外,均采用 CC BY-NC-SA 4.0 许可协议。转载请注明来源 笺札!






