Continuous Subarrays

medium array sliding window monotonic queue

Problem

Given an array nums, a contiguous subarray is called continuous when every pair of its elements differs by at most 2 — equivalently, its largest value minus its smallest value is ≤ 2. Return the total number of continuous subarrays.

Inputnums = [5, 4, 2, 4]
Output8
Length 1: [5],[4],[2],[4] → 4. Length 2: [5,4],[4,2],[2,4] → 3. Length 3: [4,2,4] (max−min = 2) → 1. Total = 8.

from collections import deque

def continuous_subarrays(nums):
    mx = deque(); mn = deque(); l = 0; total = 0
    for r, v in enumerate(nums):
        while mx and nums[mx[-1]] <= v: mx.pop()
        while mn and nums[mn[-1]] >= v: mn.pop()
        mx.append(r); mn.append(r)
        while nums[mx[0]] - nums[mn[0]] > 2:
            l += 1
            if mx[0] < l: mx.popleft()
            if mn[0] < l: mn.popleft()
        total += r - l + 1
    return total
function continuousSubarrays(nums) {
  const mx = [], mn = [];
  let l = 0, total = 0;
  for (let r = 0; r < nums.length; r++) {
    while (mx.length && nums[mx[mx.length - 1]] <= nums[r]) mx.pop();
    while (mn.length && nums[mn[mn.length - 1]] >= nums[r]) mn.pop();
    mx.push(r); mn.push(r);
    while (nums[mx[0]] - nums[mn[0]] > 2) {
      l++;
      if (mx[0] < l) mx.shift();
      if (mn[0] < l) mn.shift();
    }
    total += r - l + 1;
  }
  return total;
}
class Solution {
    public long continuousSubarrays(int[] nums) {
        Deque<Integer> mx = new ArrayDeque<>(), mn = new ArrayDeque<>();
        int l = 0; long total = 0;
        for (int r = 0; r < nums.length; r++) {
            while (!mx.isEmpty() && nums[mx.peekLast()] <= nums[r]) mx.pollLast();
            while (!mn.isEmpty() && nums[mn.peekLast()] >= nums[r]) mn.pollLast();
            mx.offerLast(r); mn.offerLast(r);
            while (nums[mx.peekFirst()] - nums[mn.peekFirst()] > 2) {
                l++;
                if (mx.peekFirst() < l) mx.pollFirst();
                if (mn.peekFirst() < l) mn.pollFirst();
            }
            total += r - l + 1;
        }
        return total;
    }
}
long long continuousSubarrays(vector<int>& nums) {
    deque<int> mx, mn;
    int l = 0; long long total = 0;
    for (int r = 0; r < (int)nums.size(); r++) {
        while (!mx.empty() && nums[mx.back()] <= nums[r]) mx.pop_back();
        while (!mn.empty() && nums[mn.back()] >= nums[r]) mn.pop_back();
        mx.push_back(r); mn.push_back(r);
        while (nums[mx.front()] - nums[mn.front()] > 2) {
            l++;
            if (mx.front() < l) mx.pop_front();
            if (mn.front() < l) mn.pop_front();
        }
        total += r - l + 1;
    }
    return total;
}
Time: O(n) Space: O(n)