Skip to content

Latest commit

 

History

History
95 lines (74 loc) · 4.29 KB

2461.Maximum_Sum_of_Distinct_Subarrays_With_Length_K(Medium).md

File metadata and controls

95 lines (74 loc) · 4.29 KB

2461. Maximum Sum of Distinct Subarrays With Length K (Medium)

Date and Time: Nov 19, 2024, 11:46 (EST)

Link: https://leetcode.com/problems/maximum-sum-of-distinct-subarrays-with-length-k/


Question:

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.

A 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 <= 10^5

  • 1 <= nums[i] <= 10^5


Walk-through:

We use sliding window of size k to calculate curSum of current subarray, then we update res = max(res, curSum) and move the sliding window to the left to update curSum.

When we encounter an element nums[r] that exists in the hashmap{}, we need to update the sliding window by removing nums[l] and update l += 1 until there is no more duplicate element exists.


Python Solution:

class Solution:
    def maximumSubarraySum(self, nums: List[int], k: int) -> int:
        # res to keep track of the maximum subarry sum
        # Use two ptrs to maintain a size k, distinct subarry
        # Use hashmap to keep track of the count of each element
        # while a num already in hashmap, we increment l until not
        # Otherwise, just add the new right-most element into curSum. 
        # If length == k, update res and remove the left-most element

        # TC: O(n), n = len(nums), SC: O(n)
        res, curSum = 0, 0
        l, hashmap = 0, {}
        for r in range(len(nums)):
            # while nums[r] in hashmap, increment l until not
            while nums[r] in hashmap:
                curSum -= nums[l]
                del hashmap[nums[l]]
                l += 1
            # If not duplicate, add the new right-most element
            curSum += nums[r]
            hashmap[nums[r]] = 1
            # If subarray has size k, update res and remove the left-most element
            if r - l + 1 == k:
                res = max(res, curSum)
                curSum -= nums[l]
                del hashmap[nums[l]]
                l += 1
        return res

Time Complexity: $O(n)$
Space Complexity: $O(n)$


CC BY-NC-SABY: credit must be given to the creatorNC: Only noncommercial uses of the work are permittedSA: Adaptations must be shared under the same terms