2537. Count the Number of Good Subarrays
Description
Given an integer array nums
and an integer k
, return the number of good subarrays of nums
.
A subarray arr
is good if there are at least k
pairs of indices (i, j)
such that i < j
and arr[i] == arr[j]
.
A subarray is a contiguous non-empty sequence of elements within an array.
Example 1:
Input: nums = [1,1,1,1,1], k = 10 Output: 1 Explanation: The only good subarray is the array nums itself.
Example 2:
Input: nums = [3,1,4,3,2,2,4], k = 2 Output: 4 Explanation: There are 4 different good subarrays: - [3,1,4,3,2,2] that has 2 pairs. - [3,1,4,3,2,2,4] that has 3 pairs. - [1,4,3,2,2,4] that has 2 pairs. - [4,3,2,2,4] that has 2 pairs.
Constraints:
1 <= nums.length <= 105
1 <= nums[i], k <= 109
Solutions
Solution 1: Hash Table + Two Pointers
If a subarray contains \(k\) pairs of identical elements, then this subarray must contain at least \(k\) pairs of identical elements.
We use a hash table \(\textit{cnt}\) to count the occurrences of elements within the sliding window, a variable \(\textit{cur}\) to count the number of identical pairs within the window, and a pointer \(i\) to maintain the left boundary of the window.
As we iterate through the array \(\textit{nums}\), we treat the current element \(x\) as the right boundary of the window. The number of identical pairs in the window increases by \(\textit{cnt}[x]\), and we increment the count of \(x\) by 1, i.e., \(\textit{cnt}[x] \leftarrow \textit{cnt}[x] + 1\). Next, we repeatedly check if the number of identical pairs in the window is greater than or equal to \(k\) after removing the leftmost element. If it is, we decrement the count of the leftmost element, i.e., \(\textit{cnt}[\textit{nums}[i]] \leftarrow \textit{cnt}[\textit{nums}[i]] - 1\), reduce the number of identical pairs in the window by \(\textit{cnt}[\textit{nums}[i]]\), i.e., \(\textit{cur} \leftarrow \textit{cur} - \textit{cnt}[\textit{nums}[i]]\), and move the left boundary to the right, i.e., \(i \leftarrow i + 1\). At this point, all elements to the left of and including the left boundary can serve as the left boundary for the current right boundary, so we add \(i + 1\) to the answer.
Finally, we return the answer.
The time complexity is \(O(n)\), and the space complexity is \(O(n)\), where \(n\) is the length of the array \(\textit{nums}\).
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 |
|
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 |
|
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 |
|
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 |
|
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 |
|
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 |
|