Maximum Sum of Distinct Subarrays With Length K

medium sliding window hash set

Problem

You are given an array of positive integers nums and an integer k. Among all subarrays of nums whose length is exactly k and whose elements are pairwise distinct, find the largest possible sum. If no length-k subarray has all distinct values, return 0.

Inputnums = [1,5,4,2,9,9,9], k = 3
Output15
[4,2,9] sums to 15 with all values distinct; every later window repeats 9, so it cannot count.

def maximum_subarray_sum(nums, k):
    freq = {}
    win_sum = 0
    best = 0
    for r, x in enumerate(nums):
        freq[x] = freq.get(x, 0) + 1
        win_sum += x
        if r >= k:
            old = nums[r - k]
            freq[old] -= 1
            if freq[old] == 0:
                del freq[old]
            win_sum -= old
        if r >= k - 1 and len(freq) == k:
            best = max(best, win_sum)
    return best
function maximumSubarraySum(nums, k) {
  const freq = new Map();
  let winSum = 0, best = 0;
  for (let r = 0; r < nums.length; r++) {
    const x = nums[r];
    freq.set(x, (freq.get(x) || 0) + 1);
    winSum += x;
    if (r >= k) {
      const old = nums[r - k];
      if (freq.get(old) === 1) freq.delete(old);
      else freq.set(old, freq.get(old) - 1);
      winSum -= old;
    }
    if (r >= k - 1 && freq.size === k) {
      best = Math.max(best, winSum);
    }
  }
  return best;
}
long maximumSubarraySum(int[] nums, int k) {
    Map<Integer, Integer> freq = new HashMap<>();
    long winSum = 0, best = 0;
    for (int r = 0; r < nums.length; r++) {
        int x = nums[r];
        freq.merge(x, 1, Integer::sum);
        winSum += x;
        if (r >= k) {
            int old = nums[r - k];
            if (freq.merge(old, -1, Integer::sum) == 0) freq.remove(old);
            winSum -= old;
        }
        if (r >= k - 1 && freq.size() == k) {
            best = Math.max(best, winSum);
        }
    }
    return best;
}
long long maximumSubarraySum(vector<int>& nums, int k) {
    unordered_map<int, int> freq;
    long long winSum = 0, best = 0;
    for (int r = 0; r < (int)nums.size(); r++) {
        int x = nums[r];
        freq[x]++;
        winSum += x;
        if (r >= k) {
            int old = nums[r - k];
            if (--freq[old] == 0) freq.erase(old);
            winSum -= old;
        }
        if (r >= k - 1 && (int)freq.size() == k) {
            best = max(best, winSum);
        }
    }
    return best;
}
Time: O(n) Space: O(k)