Description
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
Solution
Sliding window (TLE)
Use a sliding window to store all the elements we have visited. When the current element is in the sliding window, pop from left until it doesn't exist.
Time complexity: o ( n 2 ) o(n^2) o(n2)
Space complexity: o ( n ) o(n) o(n)
Sliding window + set
Previous solution will exceed the time limit because list's in
has o ( n ) o(n) o(n) complexity. To mitigate this, we could use an additional set to store all the elements.
Time complexity: o ( n ) o(n) o(n)
Space complexity: o ( n ) o(n) o(n)
Code
Sliding window (TLE)
python3
class Solution:
def maximumSubarraySum(self, nums: List[int], k: int) -> int:
sliding_window = collections.deque([])
cur_sum = 0
max_sum = 0
for each_num in nums:
while each_num in sliding_window or len(sliding_window) == k:
pop_ele = sliding_window.popleft()
cur_sum -= pop_ele
cur_sum += each_num
sliding_window.append(each_num)
if len(sliding_window) == k:
max_sum = max(max_sum, cur_sum)
return max_sum
Sliding window + set
python3
class Solution:
def maximumSubarraySum(self, nums: List[int], k: int) -> int:
sliding_window = collections.deque([])
window_ele = set()
cur_sum = 0
max_sum = 0
for each_num in nums:
while each_num in window_ele or len(sliding_window) == k:
pop_ele = sliding_window.popleft()
window_ele.remove(pop_ele)
cur_sum -= pop_ele
cur_sum += each_num
sliding_window.append(each_num)
window_ele.add(each_num)
if len(sliding_window) == k:
max_sum = max(max_sum, cur_sum)
return max_sum