题目:
给你一个正整数数组 nums ,请你从中删除一个含有 若干不同元素 的子数组。删除子数组的 得分 就是子数组各元素之 和 。
返回 只删除一个 子数组可获得的 最大得分 。
如果数组 b 是数组 a 的一个连续子序列,即如果它等于 a[l],a[l+1],...,a[r] ,那么它就是 a 的一个子数组。
来源:力扣(LeetCode)
链接:https://leetcode-cn.com/problems/maximum-erasure-value
著作权归领扣网络所有。商业转载请联系官方授权,非商业转载请注明出处。
题解:
class Solution {
public:
int maximumUniqueSubarray(vector<int>& nums) {
vector<int> presum = nums;
for(int i=1;i<nums.size();i++){
presum[i] = presum[i-1]+nums[i];
}
//左右指针
int left = 0;
int right = 0;
int res = 0;
set<int> s;
for(;right<nums.size();right++){
int right_data = nums[right];
while(s.insert(right_data).second==false){
int left_data = nums[left];
left++;
//在集合中擦数据,以其达到无重复
s.erase(left_data);
}
//记录
int t = 0;
if(left==0){
t = presum[right];
}else{
t = presum[right]-presum[left-1];
}
//每次更新res
res = max(res,t);
}
return res;
}
};
思路:
其实这个题对于目前我这个小菜鸡,我由于对这种滑动窗口题还不是很了解,所以就参考别人的思路。(自己之前见过,但是没有想到滑动窗口)
这里只需要明白几点就可以了
- 首先这种滑动窗口子数组,基本好像都是双指针,右指针一直移动直到不符合要求,移动左指针,直到符合条件。
- 然后就是这里用set来达到不重复元素的目的,每次移动更新res即可!
不懂可以评论区问我ou!
haha第一次双百!