992. Subarrays with K Different Integers
T: O(n)
S: O(n)
```java
class Solution {
public int subarraysWithKDistinct(int[] nums, int k) {
int subarrayWithAtMostK = subarrayWithAtMostK(nums, k);
int subarrayWithAtMostKMinusOne = subarrayWithAtMostK(nums, k-1);
return subarrayWithAtMostK - subarrayWithAtMostKMinusOne;
}
private int subarrayWithAtMostK(int[] nums, int k) {
int n = nums.length;
int left = 0;
int result = 0;
Map<Integer, Integer> freqMap = new HashMap<>();
for (int right = 0; right < n; right++) {
int rightNum = nums[right];
freqMap.put(rightNum, freqMap.getOrDefault(rightNum, 0)+1);
while (left <= right && freqMap.size() > k) {
int leftNum = nums[left];
freqMap.put(leftNum, freqMap.getOrDefault(leftNum, 0)-1);
if (freqMap.get(leftNum) == 0) {
freqMap.remove(leftNum);
}
left++;
}
result += (right - left + 1);
}
return result;
}
}
/**
T: O(n)
S: O(n)
0 1 2 3 4
[1,2,1,2,3]
r
l
1 + 2 + 3 + 4 + 2
r - l + 1 -> length is (r - l + 1) 's subarray can be these:
[1] -> 1
[1,2][2] -> 2
[2,1'], [1,2,1'] [1']. -> 3
4:
[1,2,1,2]
[2,1,2']
[1,2']
[2']
2: [2',3], [3]
above inclue 1 distinct, so we have to subtract it
Consider nums = [1, 2, 1, 2, 3] and k = 2.
slidingWindowAtMost(nums, 2) will count all subarrays (12) with at most 2 distinct elements (including those with exactly 2 and 1).
slidingWindowAtMost(nums, 1) will count all subarrays (5) with at most 1 distinct element.
The difference, slidingWindowAtMost(nums, 2) - slidingWindowAtMost(nums, 1),
removes subarrays with 1 distinct element, leaving only those with exactly 2, which is our answer (7).
*/
```
Previous2444. Count Subarrays With Fixed BoundsNext2962. Count Subarrays Where Max Element Appears at Least K Times
Last updated