题目:1695. 删除子数组的最大得分

思路:哈希表+双指针,时间复杂度0(n)。
哈希表维护双指针内元素出现的情况,当右指针指向的元素数量大于1时,移动左指针,直到数量为1即可。细节看注释
C++版本:
cpp
class Solution {
public:
int maximumUniqueSubarray(vector<int>& nums) {
// 哈希表维护双指针内元素出现的情况
unordered_map<int,int> mp;
int n=nums.size();
int sum=0,mx=0;
for(int i=0,j=0;j<n;j++){
sum+=nums[j];
mp[nums[j]]++;
// cout<<mp[nums[j]]<<":";
// 当右指针指向的元素数量大于1时
while(mp[nums[j]]>1){
// 移动左指针,直到数量为1即可
mp[nums[i]]--;
sum-=nums[i];
i++;
}
// cout<<i<<":"<<j<<endl;
mx=max(mx,sum);
}
return mx;
}
};
JAVA版本:
java
class Solution {
public int maximumUniqueSubarray(int[] nums) {
Map<Integer,Integer> mp =new HashMap<>();
int n=nums.length;
int sum=0,mx=0;
for(int i=0,j=0;j<n;j++){
sum+=nums[j];
mp.merge(nums[j],1,Integer::sum);
// cout<<mp[nums[j]]<<":";
while(mp.get(nums[j])>1){
mp.merge(nums[i],-1,Integer::sum);
sum-=nums[i];
i++;
}
// cout<<i<<":"<<j<<endl;
mx=Math.max(mx,sum);
}
return mx;
}
}
GO版本:
go
func maximumUniqueSubarray(nums []int) int {
mp:=map[int]int{}
sum,mx:=0,0
n:=len(nums)
for i,j:=0,0;j<n;j++ {
sum+=nums[j]
mp[nums[j]]++
for mp[nums[j]]>1 {
mp[nums[i]]--
sum-=nums[i]
i++
}
mx=max(mx,sum)
}
return mx
}