題目描述
給定一個元素都是正整數的數組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]。
題解
- 定義兩個變量left和right標識有效數據的左邊界和右邊界,初始爲0,有效數據指的是≤R的數。
- 定義gap標識有效區域中最右側的在L~R之間的數,初始爲-1
- 如果nums[i]>R,那麼left、right分別置爲i+1,gap置爲-1
- 如果nums[i]<L,那麼判斷gap是否≥left,如果滿足則統計子數組的數量
- 如果nums[i]在L和R之間,更新gap的右邊界,並且統計子數組的數量right-left+1,最後有效區域右邊界right++
- 時間複雜度爲O(N)
public int numSubarrayBoundedMax(int[] A, int L, int R) {
int count=0;
int l=0,gap=-1;
for(int i=0;i<A.length;i++) {
if(A[i]>R) {
l=i+1;
gap=-1;
}else if(A[i]<L) {
if(gap>=l)
count+=gap-l+1;
}else {
gap=i;
count+=gap-l+1;
}
}
return count;
}