Continuous Subarrays

Key Transformation & Invariant: dual monotonic deques track window min & max; shrink left while max - min > 2, add right - left + 1
"""
QUESTION
--------
Given an array `nums`, a subarray is "continuous" if for every pair of its
elements the absolute difference is at most 2 (equivalently max - min <= 2).
Return the total number of continuous subarrays.

EXAMPLES
--------
continuous_subarrays([5, 4, 2, 4]) -> 8
continuous_subarrays([1, 2, 3])    -> 6

HINT (two monotonic queues = a sliding window)
----------------------------------------------
Grow a window with right pointer; keep a max-deque and a min-deque of the
current window. While  max - min > 2,  advance left (popping from whichever
deque's front falls out). For each right, all subarrays ending at right and
starting in [left, right] are valid -> add (right - left + 1).
O(n).
"""
from collections import deque


def continuous_subarrays(nums):
    min_dq = deque()
    max_dq = deque()
    left = 0
    total = 0

    for right, x in enumerate(nums):
        while min_dq and nums[min_dq[-1]] >= x:
            min_dq.pop()
        min_dq.append(right)

        while max_dq and nums[max_dq[-1]] <= x:
            max_dq.pop()
        max_dq.append(right)

        while nums[max_dq[0]] - nums[min_dq[0]] > 2:
            left += 1
            if min_dq[0] < left:
                min_dq.popleft()
            if max_dq[0] < left:
                max_dq.popleft()

        total += right - left + 1

    return total


assert continuous_subarrays([5, 4, 2, 4]) == 8
assert continuous_subarrays([1, 2, 3]) == 6
assert continuous_subarrays([1, 1, 1]) == 6
assert continuous_subarrays([31, 25, 72, 79, 74]) == 5