Number of Subarrays with Bounded Maximum

medium two-pointers arrays counting

Problem

Given an integer array nums and two integers left and right, return the number of contiguous non-empty subarrays such that the value of the maximum element in the subarray is in the range [left, right].

Inputnums = [2,1,4,3], left = 2, right = 3
Output3
Subarrays: [2], [2,1], [3].

def numSubarrayBoundedMax(nums, left, right):
    def count(bound):
        cur = ans = 0
        for x in nums:
            cur = cur + 1 if x <= bound else 0
            ans += cur
        return ans
    return count(right) - count(left - 1)
var numSubarrayBoundedMax = function(nums, left, right) {
    const count = (bound) => {
        let cur = 0, ans = 0;
        for (const x of nums) {
            cur = x <= bound ? cur + 1 : 0;
            ans += cur;
        }
        return ans;
    };
    return count(right) - count(left - 1);
};
class Solution {
    public int numSubarrayBoundedMax(int[] nums, int left, int right) {
        return count(nums, right) - count(nums, left - 1);
    }
    private int count(int[] nums, int bound) {
        int cur = 0, ans = 0;
        for (int x : nums) {
            cur = x <= bound ? cur + 1 : 0;
            ans += cur;
        }
        return ans;
    }
}
class Solution {
    int count(vector<int>& nums, int bound) {
        int cur = 0, ans = 0;
        for (int x : nums) {
            cur = x <= bound ? cur + 1 : 0;
            ans += cur;
        }
        return ans;
    }
public:
    int numSubarrayBoundedMax(vector<int>& nums, int left, int right) {
        return count(nums, right) - count(nums, left - 1);
    }
};
Time: O(n) Space: O(1)