Bootstrap

leetcode算法——删除子数组的最大得分(java)

给你一个正整数数组 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;
    }
}

;