【Leetcode 每日一题】2444. 统计定界子数组的数目
问题背景
给你一个整数数组 n u m s nums nums 和两个整数 m i n K minK minK 以及 m a x K maxK maxK。
n u m s nums nums的定界子数组是满足下述条件的一个子数组:
- 子数组中的 最小值 等于 m i n K minK minK。
- 子数组中的 最大值 等于 m a x K maxK maxK。
返回定界子数组的数目。
子数组是数组中的一个连续部分。
数据约束
- 2 ≤ n u m s . l e n g t h ≤ 1 0 5 2 \le nums.length \le 10 ^ 5 2≤nums.length≤105
- 1 ≤ n u m s [ i ] , m i n K , m a x K ≤ 1 0 6 1 \le nums[i], minK, maxK \le 10 ^ 6 1≤nums[i],minK,maxK≤106
解题过程
确定了左右端点,就可以唯一确定一个子数组。
这题中符合条件的子数组数量,是根据待查找的 m i n K minK minK 和 m a x K maxK maxK 位置变化而变化的。
枚举数组的右端点,找到 m i n K minK minK 或 m a x K maxK maxK,这时上一个符合条件的位置到越界位置之间的所有元素,都可以作为数组的左端点,这样就能计算出子数组的数量了。
需要注意的是, 0 0 0 是合法位置的下标,初始状态要赋值为 − 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;}
}