此题解采用滑动窗口的策略,通过一次遍历来统计符合条件的子数组。对于数组中的每一个元素,我们维护两个变量 premin 和 premax 来记录满足条件 minK 和 maxK 的最近的索引位置。当遍历到的元素值小于 minK 或大于 maxK 时,说明当前元素不能被包含在任何有效的子数组中,此时需要重置 premin、premax,并将左指针 l 移动到当前右指针的下一个位置。如果当前元素等于 minK 或 maxK,则更新 premin 或 premax 的值。只有当 premin 和 premax 都被有效更新后,才计算当前的右指针 r 到左指针 l 之间的符合条件的子数组数量,增加的数量为 min(premin, premax) - l + 1。
时间复杂度: O(n)
空间复杂度: O(1)
class Solution:
def countSubarrays(self, nums: List[int], minK: int, maxK: int) -> int:
premin, premax = -1, -1 # 初始化 premin 和 premax
l = 0 # 初始化左指针
ans = 0 # 存储定界子数组的数量
for r, x in enumerate(nums): # 遍历数组元素及其索引
if x < minK or x > maxK: # 元素不在[minK, maxK]范围内
premin, premax = -1, -1 # 重置 premin 和 premax
l = r + 1 # 移动左指针
continue
if x == minK: # 更新 minK 的最新位置
premin = r
if x == maxK: # 更新 maxK 的最新位置
premax = r
if premin != -1 and premax != -1: # premin 和 premax 都有效时
ans += (premin if premin < premax else premax) - l + 1 # 计算定界子数组的数量
return ans # 返回结果