题目:
给你一个整数数组 nums 和一个整数 k 。 请你从 nums 中满足下述条件的全部子数组中找出最大子数组和: 子数组的长度是 k,且 子数组中的所有元素 各不相同 。 返回满足题面要求的最大子数组和。如果不存在子数组满足这些条件,返回 0 。 子数组 是数组中一段连续非空的元素序列。
示例:
输入:nums = [1,5,4,2,9,9,9], k = 3 输出:15 解释:nums 中长度为 3 的子数组是: - [1,5,4] 满足全部条件,和为 10 。 - [5,4,2] 满足全部条件,和为 11 。 - [4,2,9] 满足全部条件,和为 15 。 - [2,9,9] 不满足全部条件,因为元素 9 出现重复。 - [9,9,9] 不满足全部条件,因为元素 9 出现重复。 因为 15 是满足全部条件的所有子数组中的最大子数组和,所以返回 15 。
解答:
class Solution { public long maximumSubarraySum(int[] nums, int k) { long count = 0; HashSet<Integer> map = new HashSet<>(); int left = 0; int right = 0; long sum = 0; while(right<nums.length){ while(map.contains(nums[right])||right-left>=k){ sum-=nums[left]; map.remove(nums[left]); left++; } sum+=nums[right]; map.add(nums[right]); right++; if(right-left==k){ count = Math.max(count,sum); } } return count; } }
思路:
直接暴力接法会超时,所以采用滑动窗口来解答,主要有两点提效: 1. 滑动窗口只需遍历一遍,减少循环次数 2. 采用hash减少查找的时间