题目描述
这是 LeetCode 上的「795. 区间子数组个数」,难度为「中等」。
Tag : 「模拟」、「单调栈」
给你一个整数数组 nums
和两个整数:left
及 right
。
找出 nums
中连续、非空且其中最大元素在范围
内的子数组,并返回满足条件的子数组的个数。
生成的测试用例保证结果符合 32-bit
整数范围。
示例 1:
代码语言:javascript复制输入:nums = [2,1,4,3], left = 2, right = 3
输出:3
解释:满足条件的三个子数组:[2], [2, 1], [3]
示例 2:
代码语言:javascript复制输入:nums = [2,9,2,5,6], left = 2, right = 8
输出:7
提示:
单调栈
为了方便,我们令
为
。
一个容易想到的思路是使用「单调栈」。
统计所有最大值范围在
之间的子数组个数,可等价为统计每一个范围落在
之间的
作为最大值时子数组的个数。
由此可以进一步将问题转换为:求解每个
作为子数组最大值时,最远的合法左右端点的位置。也就是求解每一个
左右最近一个比其“大”的位置,这可以使用「单调栈」来进行求解。
❝对于单调栈不了解的同学,可以看前置