Count Subarrays With Fixed Bounds

hard array queue sliding window monotonic queue

Problem

Given nums, minK and maxK, count subarrays whose minimum is minK and maximum is maxK.

Inputnums = [1,3,5,2,7,5], minK = 1, maxK = 5
Output2
Subarrays [1,3,5] and [1,3,5,2].

def count_subarrays(nums, min_k, max_k):
    ans = 0
    min_pos = max_pos = bad = -1
    for i, x in enumerate(nums):
        if x < min_k or x > max_k:
            bad = i
        if x == min_k:
            min_pos = i
        if x == max_k:
            max_pos = i
        ans += max(0, min(min_pos, max_pos) - bad)
    return ans
function countSubarrays(nums, minK, maxK) {
  let ans = 0, minPos = -1, maxPos = -1, bad = -1;
  for (let i = 0; i < nums.length; i++) {
    const x = nums[i];
    if (x < minK || x > maxK) bad = i;
    if (x === minK) minPos = i;
    if (x === maxK) maxPos = i;
    ans += Math.max(0, Math.min(minPos, maxPos) - bad);
  }
  return ans;
}
class Solution {
    public long countSubarrays(int[] nums, int minK, int maxK) {
        long ans = 0;
        int minPos = -1, maxPos = -1, bad = -1;
        for (int i = 0; i < nums.length; i++) {
            int x = nums[i];
            if (x < minK || x > maxK) bad = i;
            if (x == minK) minPos = i;
            if (x == maxK) maxPos = i;
            ans += Math.max(0, Math.min(minPos, maxPos) - bad);
        }
        return ans;
    }
}
long long countSubarrays(vector<int>& nums, int minK, int maxK) {
    long long ans = 0;
    int minPos = -1, maxPos = -1, bad = -1;
    for (int i = 0; i < (int)nums.size(); i++) {
        int x = nums[i];
        if (x < minK || x > maxK) bad = i;
        if (x == minK) minPos = i;
        if (x == maxK) maxPos = i;
        ans += max(0, min(minPos, maxPos) - bad);
    }
    return ans;
}
Time: O(n) Space: O(1)