LeetCode——1695. 删除子数组的最大得分
通过万岁!!!
- 题目:给你一个数字,里面全是int值,然后让你从中删除某个子数组,要求这个子数组中不能存在相同的数,并且要求子数组的和最大。其实这里还要求这个子数组是连续的话,我最开始以为不需要连续的。
- 思路:这里有个关键,就是不重复,我们就需要用哈希了。我们需要遍历这个数组,往set中加,如果原本在set中了,则需要进行删除元素,直到可以加入这个元素。这个set其实就是一个子数组,但是set是无序的,所以我们需要找个变量,记录子数组中最左边的元素。这样我们就可以依次删除元素,直到当前遍历的第i个元素可以放入set。除此之外,每次我们还需要比较当前set的元素和跟之前的set元素和的最大值。最后将这个最大值返回即可。其实就是滑动窗口。
- 技巧:滑动窗口,哈希
java代码
class Solution {public int maximumUniqueSubarray(int[] nums) {int max = nums[0];int left = 0;Set<Integer> set = new HashSet<>();set.add(max);int setSum = max;for (int i = 1; i < nums.length; i++) {while (set.contains(nums[i])) {setSum -= nums[left];set.remove(nums[left++]);}set.add(nums[i]);setSum += nums[i];max = Math.max(max, setSum);}return max;}
}
- 总结:题目不是特别难,主要是要想到滑动窗口,我这个时间复杂度是O(n^2),最坏的情况下是前面n-1个元素都不同,但是最后一个元素跟第一个元素相同,这样其实就是for循环了两次这个数组。