题目描述
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之间的,但是事实证明并不需要,这里我对于题意有点误区。
这里我们可以把数字分为三类,1. 在L和R之间,即valid。2. 小于L,这种不会导致连续的中断,也可以带来扩展。 3. 大于R,这种会导致子序列中断。
这里我们记录下来前两种,第一种每次都可以加入count,第二种只增长length和contigous_unvalid,第二个用于记录连续的小于L的数字的个数,然后通过一个公式可以计算出count。详见代码,代码的思路很清晰。
时间复杂度分析
时间复杂度是O(n) n为字符串的长度
代码
#include <iostream>
#include <vector>
using namespace std;
class Solution {
public:
int numSubarrayBoundedMax(vector<int>& A, int L, int R) {
int maximum = -1, length = 0, count = 0, contiguous_unvalid = 0;
for (int i = 0; i < A.size(); i++) {
if (A[i] > R) {
length = 0;
contiguous_unvalid = 0;
} else {
if (A[i] < L) contiguous_unvalid += 1;
else contiguous_unvalid = 0;
length += 1;
count += length - contiguous_unvalid;
}
}
return count;
}
};