Description
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].
分析
题目的意思是:给你一个数组,然后找出一个子数组,其中子数组的最大值不小于L,不大于R,问这样的子数组有多少个。
- 看数组[2, 1, 4, 3]的最大值在[-∞, 4]范围内的子数组的个数。当遍历到2时,只有一个子数组[2],遍历到1时,有三个子数组,[2], [1], [2,1]。当遍历到4时,有六个子数组,[2], [1], [4], [2,1], [1,4], [2,1,4]。当遍历到3时,有十个子数组。其实如果长度为n的数组的最大值在范围[-∞, x]内的话,其所有子数组都是符合题意的,而长度为n的数组共有n(n+1)/2个子数组,刚好是等差数列的求和公式。
- 当遍历到的数字大于等于L时,right赋值为当前位置i,那么每次res加上right - left,随着right的不停自增1,每次加上的right - left,实际上也是一个等差数列。当A[i]大于R的时候,left = i,那么此时A[i]肯定也大于等于L,于是rihgt=i,那么right - left为0,相当于上面的cur重置为0的操作.
代码
class Solution {
public:
int numSubarrayBoundedMax(vector<int>& A, int L, int R) {
int left=-1,right=-1;
int res=0;
for(int i=0;i<A.size();i++){
if(A[i]>R) left=i;
if(A[i]>=L) right=i;
res+=right-left;
}
return res;
}
};
参考文献
795. Number of Subarrays with Bounded Maximum
[LeetCode] Number of Subarrays with Bounded Maximum 有界限最大值的子数组数量