Date and Time: Nov 19, 2024, 11:46 (EST)
Link: https://leetcode.com/problems/maximum-sum-of-distinct-subarrays-with-length-k/
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.
-
1 <= k <= nums.length <= 10^5
-
1 <= nums[i] <= 10^5
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.
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:
Space Complexity: