问题背景
给你一个整数数组 numsnumsnums 和两个整数 minKminKminK 以及 maxKmaxKmaxK。
numsnumsnums的定界子数组是满足下述条件的一个子数组:
- 子数组中的 最小值 等于 minKminKminK。
- 子数组中的 最大值 等于 maxKmaxKmaxK。
返回定界子数组的数目。
子数组是数组中的一个连续部分。
数据约束
- 2≤nums.length≤1052 \le nums.length \le 10 ^ 52≤nums.length≤105
- 1≤nums[i],minK,maxK≤1061 \le nums[i], minK, maxK \le 10 ^ 61≤nums[i],minK,maxK≤106
解题过程
确定了左右端点,就可以唯一确定一个子数组。
这题中符合条件的子数组数量,是根据待查找的 minKminKminK 和 maxKmaxKmaxK 位置变化而变化的。
枚举数组的右端点,找到 minKminKminK 或 maxKmaxKmaxK,这时上一个符合条件的位置到越界位置之间的所有元素,都可以作为数组的左端点,这样就能计算出子数组的数量了。
需要注意的是,000 是合法位置的下标,初始状态要赋值为 −1-1−1。
具体实现
class Solution {
public long countSubarrays(int[] nums, int minK, int maxK) {
long res = 0;
int minIndex = -1, maxIndex = -1, rangeIndex = -1;
for (int i = 0; i < nums.length; i++) {
int cur = nums[i];
if (cur == minK) {
minIndex = i;
}
if (cur == maxK) {
maxIndex = i;
}
if (cur < minK || cur > maxK) {
rangeIndex = i;
}
res += Math.max(Math.min(minIndex, maxIndex) - rangeIndex, 0);
}
return res;
}
}