795. 区间子数组个数
给你一个整数数组 nums
和两个整数:left
及 right
。找出 nums
中连续、非空且其中最大元素在范围 [left, right]
内的子数组,并返回满足条件的子数组的个数。
生成的测试用例保证结果符合 32-bit 整数范围。
示例 1:
输入:nums = [2,1,4,3], left = 2, right = 3
输出:3
解释:满足条件的三个子数组:[2], [2, 1], [3]
示例 2:
输入:nums = [2,9,2,5,6], left = 2, right = 8
输出:7
提示:
-
1 <= nums.length <= 105
-
0 <= nums[i] <= 109
-
0 <= left <= right <= 109
Solution
滑动窗口,当前数作为子数组右端点。使用两个指针,ptr1记录上一个在区间内的数的下标,ptr2记录最前一个合法的小于left的数的下标,同时通过一定的初始化技巧防止错误计算,那么答案就是每个合法的ptr1-ptr2+1。
代码(C++)
class Solution {
public:
int numSubarrayBoundedMax(vector<int>& nums, int left, int right) {
int ptr1 = -1; // [left, right]
int ptr2 = 0; // [:,left)
int res = 0;
for(int i=0;i<nums.size();i++){
if(nums[i]>=left&&nums[i]<=right)ptr1 = i;
if(nums[i]>right)ptr2 = i+1;
if(ptr1>=ptr2)res += ptr1 - ptr2 + 1;
}
return res;
}
};