795. Number of Subarrays with Bounded Maximum
We are given an array A of positive integers, and two positive integers L and R (L <= R).
Return the number of (contiguous, non-empty) subarrays such that the value of the maximum array element in that subarray is at least L and at most R.
Example :
Input:
A = [2, 1, 4, 3]
L = 2
R = 3
Output: 3
Explanation:
There are three subarrays that meet the requirements: [2], [2, 1], [3].
Note:
L, R and A[i] will be an integer in the range [0, 10^9].
The length of A will be in the range of [1, 50000].
遍历数组,将遍历的元素分为下列三种情况来讨论:
①:if(A[i] >= L && A[i] <= R)
在这种情况下,子数组的种类res += i - j + 1。即每添加一个满足①条件的点子列的情况就增加 i - j + 1种(j为当前子数组的开头,i为当前子数组的结尾,注意A[j]严格满足A[j] >= L && A[j] <= R)同时记录此时的子列长度countnums= i - j + 1。
②:else if(A[i] < L)
此时新加的可能情况为res = res + countnums;
注意此时的A[i]实际上是比给定的范围要小的点,是不满足题意的,但是如果它之前的countnums不为0,说明最近一次的子列加上该点也可以构成新子列,但是必须以countnums中的子列(该子列中的最后一个元素为A[j]严格满足A[j] >= L && A[j] <= R)中的某个元素为开始,以A[i]为结尾)。
③A[i]>R
此时意味着一个旧子列的结束,更新各个对应的参数
class Solution {
public:
int numSubarrayBoundedMax(vector<int>& A, int L, int R) {
int size = A.size();
int countnums = 0;
int res = 0;
int j = 0;
for(int i = 0; i<size; i++)
{
if(A[i] >= L && A[i] <= R)
{
res += i - j + 1;
countnums = i - j + 1;
}
else if(A[i] < L)
{
res = res + countnums;
}
else
{
j = i + 1;
countnums = 0;
if(j > size)
{
break;
}
}
}
return res;
}
};