【面试高频题】难度 2/5,单调栈经典运用

2023-10-25 19:04:19 浏览数 (1)

题目描述

这是 LeetCode 上的「795. 区间子数组个数」,难度为「中等」

Tag : 「模拟」、「单调栈」

给你一个整数数组 nums 和两个整数:leftright

找出 nums 中连续、非空且其中最大元素在范围

[left, right]

内的子数组,并返回满足条件的子数组的个数。

生成的测试用例保证结果符合 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

提示:

1 <= nums.length <= 10^5
0 <= nums[i] <= 10^9
0 <= left <= right <= 10^9

单调栈

为了方便,我们令

[left, right]

[a, b]

一个容易想到的思路是使用「单调栈」。

统计所有最大值范围在

[a, b]

之间的子数组个数,可等价为统计每一个范围落在

[a, b]

之间的

nums[i]

作为最大值时子数组的个数。

由此可以进一步将问题转换为:求解每个

nums[i]

作为子数组最大值时,最远的合法左右端点的位置。也就是求解每一个

nums[i]

左右最近一个比其“大”的位置,这可以使用「单调栈」来进行求解。

❝对于单调栈不了解的同学,可以看前置

0 人点赞