Sliding Window Technique - Part 7

There is usually one caveat on sliding window approaches: usually after the main loop, you still need to make one extra check for the very last case. Treat it as a corner case, albeit critical for the correctness of the code. Talking about this line here. Code is down below, cheers, ACC.


2461. Maximum Sum of Distinct Subarrays With Length K
Medium

You are given an integer array nums and an integer k. Find the maximum subarray sum of all the subarrays of nums that meet the following conditions:

  • The length of the subarray is k, and
  • All the elements of the subarray are distinct.

Return the maximum subarray sum of all the subarrays that meet the conditions. If no subarray meets the conditions, return 0.

subarray is a contiguous non-empty sequence of elements within an array.

 

Example 1:

Input: nums = [1,5,4,2,9,9,9], k = 3
Output: 15
Explanation: The subarrays of nums with length 3 are:
- [1,5,4] which meets the requirements and has a sum of 10.
- [5,4,2] which meets the requirements and has a sum of 11.
- [4,2,9] which meets the requirements and has a sum of 15.
- [2,9,9] which does not meet the requirements because the element 9 is repeated.
- [9,9,9] which does not meet the requirements because the element 9 is repeated.
We return 15 because it is the maximum subarray sum of all the subarrays that meet the conditions

Example 2:

Input: nums = [4,4,4], k = 3
Output: 0
Explanation: The subarrays of nums with length 3 are:
- [4,4,4] which does not meet the requirements because the element 4 is repeated.
We return 0 because no subarrays meet the conditions.

 

Constraints:

  • 1 <= k <= nums.length <= 105
  • 1 <= nums[i] <= 105
Accepted
14,455
Submissions
44,090

public long MaximumSubarraySum(int[] nums, int k)
{
    //Sliding window approach
    long maxSum = 0;
    long currentSum = 0;
    Hashtable uniqueElements = new Hashtable();
    for (int i = 0; i < nums.Length; i++)
    {
        if (i < k)
        {
            if (!uniqueElements.ContainsKey(nums[i])) 
                uniqueElements.Add(nums[i], 0);
            uniqueElements[nums[i]] = (int)uniqueElements[nums[i]] + 1;
            currentSum += nums[i];
        }
        else
        {
            maxSum = (uniqueElements.Count == k && currentSum >= maxSum) ? currentSum : maxSum;

            int firstVal = nums[i - k];
            if (uniqueElements.ContainsKey(firstVal))
            {
                uniqueElements[firstVal] = (int)uniqueElements[firstVal] - 1;
                if ((int)uniqueElements[firstVal] <= 0) 
                    uniqueElements.Remove(firstVal);
                currentSum -= firstVal;
            }
            if (!uniqueElements.ContainsKey(nums[i])) 
                uniqueElements.Add(nums[i], 0);
            uniqueElements[nums[i]] = (int)uniqueElements[nums[i]] + 1;
            currentSum += nums[i];
        }
    }

    //Last, corner case
    maxSum = (uniqueElements.Count == k && currentSum >= maxSum) ? currentSum : maxSum;

    return maxSum;
}

Comments

Popular posts from this blog

Changing the root of a binary tree

ProjectEuler Problem 719 (some hints, but no spoilers)

The Power Sum, a recursive problem by HackerRank