1695.删除子数组的最大得分
注意:子数组为不同元素
方法:滑动窗口
使用变长滑动窗口寻找数组nums中的以每个下标作为结束下标的元素各不相同的最长子数组。用[start,end]表示滑动窗口,初始时start=end=0,将滑动窗口的右端点end向右移动,移动过程中维护滑动窗口的左端点start,对于每个end寻找元素各不相同的最大滑动窗口
判断滑动窗口中是否有重复元素,需要使用哈希集合存储滑动窗口中出现的元素,用sum表示滑动窗口中的元素和。对于每个右端点end,将右端点处的元素记为num = nums[end],执行如下操作:
- 将sum的值增加为num
- 如果哈希集合中有元素num,则滑动窗口[start,end]中有两个元素num,因此将sum的值减去nums[start],从哈希集中中移除元素nums[start],然后将start向右移动一位,重复该操作直到哈希集合中没有元素num
- 当前滑动窗口[start,end]中的子数组为以end作为结束下标的元素各不相同的最长子数组,其元素和为sum,使用sum更新最大得分
class Solution {
public int maximumUniqueSubarray(int[] nums) {
Set<Integer> set = new HashSet<Integer>();
int maxSum = 0,sum = 0,start = 0,end = 0,len = nums.length;
while(end < len){
int num = nums[end];
sum += num;
while(set.contains(num)){
sum -= nums[start];
set.remove(nums[start]);
start++;
}
set.add(num);
maxSum = Math.max(maxSum,sum);
end++;
}
return maxSum;
}
}