题目
解法:双指针+prefix_sum
class Solution:
def maximumUniqueSubarray(self, nums: List[int]) -> int:
prefix_sum = [0]
tmp = 0
for num in nums:
tmp += num
prefix_sum.append(tmp)
l = 0
r = 0
dic = {}
ans = 0
while r < len(nums):
if nums[r] not in dic:
ans = max(ans,prefix_sum[r+1]-prefix_sum[l])
dic[nums[r]] = True
r += 1
else:
while l<r and nums[r] in dic:
dic.pop(nums[l])
l += 1
#print(dic,ans)
return ans
解法2:双指针
其实不用prefix sum,直接一个variable就可以了
class Solution {
public:
int maximumUniqueSubarray(vector<int>& nums) {
int ans = 0;
int curr_sum = 0;
unordered_map<int,bool> seen;
int l = 0, r = 0;
while (r<nums.size()){
if (seen.find(nums[r]) == seen.end()){
curr_sum += nums[r];
seen[nums[r]] = true;
ans = max(ans,curr_sum);
r += 1;
}else{
while (l<r && seen.find(nums[r])!=seen.end()){
seen.erase(nums[l]);
curr_sum -= nums[l];
l+=1;
}
}
}
return ans;
}
};
这边C++尽量用unordered_map,普通map的查找复杂度并不是O(1)