题目链接:1695. 删除子数组的最大得分(中等)

算法原理:

解法:滑动窗口

👉对应力扣题解

击败73.91%

时间复杂度O(N)

问题转化:滑动窗口内的元素不重复,求和的最大值

跟下题解法一摸一样👇

优选算法-滑动窗口:10.无重复字符的最长字串

用HashMap解也是可以的,而且更简单,就是按着进窗口-更新-出窗口就可以了

但是用HashSet解就要先出窗口来判断进窗口的值是否窗口内已经有了

Java代码:

class Solution {
    public int maximumUniqueSubarray(int[] nums) {
        //问题转化:滑动窗口内的元素不重复,找和的最大值
        Set<Integer> hash=new HashSet<>();
        int n=nums.length,sum=0,ret=0;
        for(int right=0,left=0;right<n;right++){
            int in=nums[right];
            //出窗口
            while(hash.contains(in)){
                sum-=nums[left];
                hash.remove(nums[left++]);
            }
            //进窗口
            sum+=in;
            hash.add(in);
            //更新
            ret=Math.max(ret,sum);
        }
        return ret;
    }
}

更多推荐