0
点赞
收藏
分享

微信扫一扫

[leetcode每日一题]11.24

​​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;
}
};


举报

相关推荐

0 条评论