Leetcode 795. 区间子数组个数
题目
给定一个元素都是正整数的数组A ,正整数 L 以及 R (L <= R)。
求连续、非空且其中最大元素满足大于等于L 小于等于R的子数组个数。
测试样例 :
输入:
A = [2, 1, 4, 3]
L = 2
R = 3
输出: 3
解释: 满足条件的子数组: [2], [2, 1], [3].
注意:
- L, R 和 A[i] 都是整数,范围在 [0, 10^9]。
- 数组 A 的长度范围在[1, 50000]。
题解
0~i区间中,存储两个位置,一个是这段区间中第一个符合要求的下标first,另一个是这段区间中最后一个符合要求的下标last
遍历一个元素时,如果符合要求,则last=下标,ans += last-first+1
小于L,ans += last-first+1
大于L,first、second = 下标+1,遍历下一个数
详细过程见代码
代码
int numSubarrayBoundedMax(vector<int>& A, int L, int R) {
int n = A.size();
int first=-1,last=-1,i=0;
int cnt = 0;
while(i < n){
if(A[i] < L){
if(first==-1){ //本来没有first,现在有符合题意的下标了,更新first
first = i;
}
if(last >= first) cnt += last-first+1;
}else if(A[i] > R){ //这段区间不符合要求,故first设为-1
first = -1;
i++;
continue;
}else{
if(first == -1){
first = i;
}
last = i;
cnt += last-first+1;
}
i++;
}
return cnt;
}
来源:力扣(LeetCode)
链接:https://leetcode-cn.com/problems/number-of-subarrays-with-bounded-maximum
著作权归领扣网络所有。商业转载请联系官方授权,非商业转载请注明出处。