从Leetcode 每日一题练习继续讨论:
2461. 长度为 K 子数组中的最大和
2461. Maximum Sum of Distinct Subarrays With Length K
题解
对于这样固定长度的子数组问题,首先肯定要使用滑动窗口,再思考本题中的限制条件,子数组中所有的数字都必须是不相同的,那么可以用一个数组来记录窗口中所有数字的个数,但仅记录某个数字自身的出现次数仍不方便我们了解窗口中有重复的数字有多少个。因此还可以用一个变量记录窗口中有重复的数字个数,个数为0时说明窗口中不再有重复数字。向前不断滑动窗口,根据移出数字和移入数字处理相关情况,在窗口内没有重复数字时更新窗口数字和的最大值即可。
代码
class Solution {
public:
long long maximumSubarraySum(vector<int>& nums, int k) {
int exist[100001] = {};
long long int maxsum = 0;
int repeat = 0;
long long int arraysum = 0;
for(int i=0;i<k;i++){
if(exist[nums[i]] == 1){
repeat++;
exist[nums[i]]++;
arraysum += nums[i];
}else{
exist[nums[i]]++;
arraysum += nums[i];
}
}
if(repeat == 0){
maxsum = arraysum;
}
int left = 0;
int right = k;
while(right < nums.size()){
if(exist[nums[right]] == 1){
repeat++;
}
exist[nums[right]]++;
arraysum += nums[right];
if(exist[nums[left]] == 2){
repeat--;
}
exist[nums[left]]--;
arraysum -= nums[left];
if(repeat == 0){
maxsum = max(maxsum, arraysum);
}
right++;
left++;
}
return maxsum;
}
};