本文由旧博客内容整理迁入。原发布日期未提供,页面日期为本次整理日期。

题目

给你一个正整数数组 nums,请从中删除一个含有若干不同元素的子数组。删除子数组的得分就是子数组各元素之和。

返回只删除一个子数组可获得的最大得分。

如果数组 b 是数组 a 的一个连续子序列,即它等于 a[l], a[l+1], ..., a[r],那么它就是 a 的一个子数组。

示例

示例 1

1
2
输入:nums = [4,2,4,5,6]
输出:17

解释:最优子数组是 [2,4,5,6]。

示例 2

1
2
输入:nums = [5,2,1,2,5,2,1,2,5]
输出:8

解释:最优子数组是 [5,2,1] 或 [1,2,5]。

解题思路

这道题直接见题解,和之前的一样。维护没有重复元素的窗口,同时维护窗口内元素之和,记录最大的和。

C++ 题解

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
class Solution {
public:
int maximumUniqueSubarray(vector<int>& nums) {
unordered_map<int,int>arr;
int ans=0;
int left=0;
int res=0;
for(int i=0;i<nums.size();i++){
arr[nums[i]]++;
res=res+nums[i];
while(arr[nums[i]]>=2){
arr[nums[left]]--;
if(arr[nums[left]]==0){
arr.erase(nums[left]);
}
res=res-nums[left];
left++;
}
ans=max(ans,res);
}
return ans;
}
};