区间子数组的数目
给你一个整数数组 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
来源:力扣(LeetCode)
链接:https://leetcode.cn/problems/number-of-subarrays-with-bounded-maximum
著作权归领扣网络所有。商业转载请联系官方授权,非商业转载请注明出处。
解题思路
根据题目条件,可以将数组元素划分为三类:
- 大于right
- 在left 和 right 之间
- 小于left
要满足子数组的最大值在left和right之间,那么数组中不能包含大于right的元素,同时必须包含处于left和right之间的元素。枚举子数组的右端点i,
- 大于right,显然并不存在,
- 小于left,记录上一个大于right的下标i1和处于left和right之间的下标i2,必须包含i2但是不能包含i1,则可以构成的子数组的数目为i2 - i1
- 处于left和right之间,记录上一个大于right的下标i1,更新一下i2,依然是i2-i1