3113. 边界元素是最大值的子数组数目
题目描述
给你一个 正 整数数组 nums
。
请你求出 nums
中有多少个子数组,满足子数组中 第一个 和 最后一个 元素都是这个子数组中的 最大 值。
示例 1:
输入:nums = [1,4,3,3,2]
输出:6
解释:
总共有 6 个子数组满足第一个元素和最后一个元素都是子数组中的最大值:
- 子数组
[1,4,3,3,2]
,最大元素为 1 ,第一个和最后一个元素都是 1 。 - 子数组
[1,4,3,3,2]
,最大元素为 4 ,第一个和最后一个元素都是 4 。 - 子数组
[1,4,3,3,2]
,最大元素为 3 ,第一个和最后一个元素都是 3 。 - 子数组
[1,4,3,3,2]
,最大元素为 3 ,第一个和最后一个元素都是 3 。 - 子数组
[1,4,3,3,2]
,最大元素为 2 ,第一个和最后一个元素都是 2 。 - 子数组
[1,4,3,3,2]
,最大元素为 3 ,第一个和最后一个元素都是 3 。
所以我们返回 6 。
示例 2:
输入:nums = [3,3,3]
输出:6
解释:
总共有 6 个子数组满足第一个元素和最后一个元素都是子数组中的最大值:
- 子数组
[3,3,3]
,最大元素为 3 ,第一个和最后一个元素都是 3 。 - 子数组
[3,3,3]
,最大元素为 3 ,第一个和最后一个元素都是 3 。 - 子数组
[3,3,3]
,最大元素为 3 ,第一个和最后一个元素都是 3 。 - 子数组
[3,3,3]
,最大元素为 3 ,第一个和最后一个元素都是 3 。 - 子数组
[3,3,3]
,最大元素为 3 ,第一个和最后一个元素都是 3 。 - 子数组
[3,3,3]
,最大元素为 3 ,第一个和最后一个元素都是 3 。
所以我们返回 6 。
示例 3:
输入:nums = [1]
输出:1
解释:
nums
中只有一个子数组 [1]
,最大元素为 1 ,第一个和最后一个元素都是 1 。
所以我们返回 1 。
提示:
1 <= nums.length <= 105
1 <= nums[i] <= 109
解法
方法一:单调栈
我们考虑以数组 $nums$ 中的每个元素 $x$ 作为子数组的边界元素且最大值的情况。
每个长度为 $1$ 的子数组都满足条件,而对于长度大于 $1$ 的子数组,子数组中的所有元素都不能大于边界元素 $x$,我们可以用单调栈来实现。
我们维护一个从栈底到栈顶单调递减的栈,单调栈的每个元素是一个二元组 $[x, cnt]$,表示元素 $x$ 且以 $x$ 为边界元素且最大值的子数组的个数为 $cnt$。
我们从左到右遍历数组 $nums$,对于每个元素 $x$,我们不断地将栈顶元素弹出,直到栈为空或者栈顶元素的第一个元素大于等于 $x$。如果栈为空,或者栈顶元素的第一个元素大于 $x$,说明当前遇到第一个边界元素为 $x$ 且最大值的子数组,该子数组的长度为 $1$,所以我们将 $[x, 1]$ 入栈。如果栈顶元素的第一个元素等于 $x$,说明当前遇到的边界元素为 $x$ 且最大值的子数组,我们将栈顶元素的第二个元素加 $1$。然后,我们将栈顶元素的第二个元素加到答案中。
遍历结束后,返回答案即可。
时间复杂度 $O(n)$,空间复杂度 $O(n)$。其中 $n$ 为数组 $nums$ 的长度。
1 2 3 4 5 6 7 8 9 10 11 12 13 |
|
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 |
|
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 |
|
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 |
|
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 |
|