
注意:子数组为不同元素
方法:滑动窗口
使用变长滑动窗口寻找数组nums中的以每个下标作为结束下标的元素各不相同的最长子数组。用[start,end]表示滑动窗口,初始时start=end=0,将滑动窗口的右端点end向右移动,移动过程中维护滑动窗口的左端点start,对于每个end寻找元素各不相同的最大滑动窗口
判断滑动窗口中是否有重复元素,需要使用哈希集合存储滑动窗口中出现的元素,用sum表示滑动窗口中的元素和。对于每个右端点end,将右端点处的元素记为num = nums[end],执行如下操作:
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;
}
}