给你一个正整数数组 nums
,请你从中删除一个含有 若干不同元素 的子数组。删除子数组的 得分 就是子数组各元素之 和 。
返回 只删除一个 子数组可获得的 最大得分 。
如果数组 b
是数组 a
的一个连续子序列,即如果它等于 a[l],a[l+1],...,a[r]
,那么它就是 a
的一个子数组。
示例 1:
输入:nums = [4,2,4,5,6] 输出:17 解释:最优子数组是 [2,4,5,6]
示例 2:
输入:nums = [5,2,1,2,5,2,1,2,5] 输出:8 解释:最优子数组是 [5,2,1] 或 [1,2,5]
解题方法:(不定长滑动窗口)
1.不定长滑动窗口需要使用一个左指针,这道题需要无重复的字符,所以需要用到一个集合set
。
2.遍历数组,将元素添加到滑动窗口中,当检查到有元素与滑动窗口中的元素一样时,开始移动左指针,直到最早加进来的重复字符被删掉,然后更新结果。
class Solution {
public int maximumUniqueSubarray(int[] nums) {
int n = nums.length;
int ans = 0;
int tem = 0;
int left = 0;
Set<Integer> set = new HashSet<>();
for (int i = 0; i < n; i++) {
tem += nums[i];
while (set.contains(nums[i])) {
set.remove(nums[left]);
tem -= nums[left];
left++;
}
set.add(nums[i]);
ans = Math.max(ans, tem);
}
return ans;
}
}