https://leetcode.com/problems/number-of-subarrays-with-bounded-maximum/description/
质量比较高的medium题了
主要参考的这里的思路https://leetcode.com/problems/number-of-subarrays-with-bounded-maximum/discuss/117612/C++-O(n)-solution-with-explanations/117551?page=1
比如2 1 3 4 5 , L=2, R=4
v == 2的时候,以2为开头的一个 head = 1
v == 1的时候,1不能作为开头,但是现在所有的已经获得的Subarray都可以添加一个数1组成新的subarray
所以ans += heads
v == 3的时候,3本身可以作为开头,从tail到3的子数组还可以作为开头,所以head += tails + 1, 所有已有的head加上3也都可以作为新的开头,所以ans += head 其实就是+= 之前的heads + tails + 1
v == 4的时候,之前所有的heads都可以和4结合成新的subarray 所以ans+= heads,v==3的时候,要对tails清零,因为当v == 4的时候,+=heads已经包含了从<L的数到4的情况。
class Solution {
public:
int numSubarrayBoundedMax(vector<int>& A, int L, int R) {
int ans = 0, heads = 0, tails = 0;
for (int v : A) {
if (L <= v && v <= R) {
heads += tails + 1; //以v开头的1个sub,以v结尾的tails个
ans += heads;
tails = 0;
} else if (v < L) {
tails ++;
ans += heads;
} else {
heads = 0;
tails = 0;
}
}
return ans;
}
};