【DP】用i0,i1,i2 分别记录不符合规定的( < minK || > maxK )的元素所在位置,minK所在位置,maxK所在位置。遍历当前数组的过程中,如果 i1 和 i2都不为-1,那么能构成的子数组就是min(i1, i2) - i0。
class Solution {
public long countSubarrays(int[] nums, int minK, int maxK) {
int i0 = -1, i1 = -1, i2 = -1, n = nums.length;
long ans = 0;
for (int i = 0; i < n; i++) {
int x = nums[i];
if (x < minK || x > maxK) {
i0 = i;
i1 = -1;
i2 = -1;
}
if (x == minK) i1 = i;
if (x == maxK) i2 = i;
if (i1 != -1 && i2 != -1) ans += (long)(Math.min(i1, i2) - i0);
}
return ans;
}
}