区间子数组的数目()

区间子数组的数目

给你一个整数数组 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
————————

区间子数组的数目

给你一个整数数组 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