Editorial

# Problem Understanding The problem asks for the longest contiguous subarray (interval) in a given sequence of frequencies such that the difference between the maximum and minimum frequency in that subarray is exactly $k$. In other words, if we denote the subarray as $A[l \dots r]$, then we need: $$\text{max}(A[l \dots r]) - \text{min}(A[l \dots r]) = k.$$ If there is no contiguous subarray that satisfies the above condition, the answer must be $-1$. Note that the subarray must be contiguous and the difference must be exactly $k$, not less or greater. # Solution Analysis A very efficient way to solve this problem is by using a sliding window approach combined with data structures that help quickly retrieve the minimum and maximum elements in the current window. Here’s a breakdown of the approach: 1. **Sliding Window Framework:** Use two pointers (or indices) to represent the current subarray (window). Let the left pointer be `left` and the right pointer be `right`, initially both set to the beginning of the array. 2. **Maintaining the Maximum and Minimum:** To efficiently track the maximum and minimum elements within the current window, use two double-ended queues (deques): - **Max deque:** Maintains the elements of the current window in decreasing order. The front of this deque always contains the maximum element. - **Min deque:** Maintains the elements of the current window in increasing order. The front of this deque always holds the minimum element. When a new element is added as you expand the window with the `right` pointer, update both deques by removing elements that would no longer be useful: - Remove all elements from the back of the max deque that are less than the current element. - Remove all elements from the back of the min deque that are greater than the current element. 3. **Expanding and Contracting the Window:** - With each new element added (moving the `right` pointer), update the two deques. - Check the difference using the front elements of the two deques: $$\text{currentDiff} = \text{max} - \text{min}$$ where `max` is the element at the front of the max deque and `min` is the element at the front of the min deque. - **If $\text{currentDiff} > k$:** The current window exceeds the desired difference. In this case, move the `left` pointer to the right (i.e., shrink the window) until the condition is satisfied (i.e., until $\text{currentDiff} \leq k$). While doing so, ensure that the corresponding elements are removed from the deques if they fall out of the window. - **If $\text{currentDiff} = k$:** The current window is harmonious. Record the length of this window as a candidate for the answer. Continue expanding the window to see if a longer harmonious subarray exists. - **If $\text{currentDiff} < k$:** This window does not yet satisfy the condition, in which case simply continue expanding the window by moving the `right` pointer. 4. **Result Computation:** Keep updating the maximum length from all windows that satisfy the harmony condition until the end of the array is reached. If no window meets the condition, return $-1$. # Time and Space Complexity Analysis - **Time Complexity:** The sliding window technique ensures that each element is processed at most twice (once when the `right` pointer is expanded and possibly once when the `left` pointer is moved). The operations on the deques (pop from the back/front) are amortized $O(1)$ per element. Therefore, the overall time complexity of the solution is $O(n)$. - **Space Complexity:** The space used by the deques is at most $O(n)$ in the worst-case scenario if all elements are either in increasing or decreasing order. Thus, the overall space complexity is $O(n)$.

Author's Solution

GNU C++17