795. Number of Subarrays with Bounded Maximum
Bad
Best
int numSubarrayBoundedMax(vector<int>& A, int L, int R) {
bool valid = false;
int start = -1;
int sub_start = -1;
int r = 0;
for (int i = 0; i < A.size(); i++) {
if (A[i] <= R) {
if (start == -1) {
start = i;
}
if (A[i] >= L) {
valid = true;
if (sub_start != -1) {
r -= ((i - sub_start) * (i - sub_start + 1) / 2);
sub_start = -1;
}
} else if (sub_start == -1) {
sub_start = i;
}
} else {
if (valid) {
r += ((i - start) * (i - start + 1)) / 2;
if (sub_start != -1) {
r -= ((i - sub_start) * (i - sub_start + 1) / 2);
}
}
// reset
sub_start = -1;
start = -1;
valid = false;
}
}
if (valid) {
r += ((A.size() - start) * (A.size() - start + 1)) / 2;
if (sub_start != -1) {
r -= ((A.size() - sub_start) * (A.size() - sub_start + 1) / 2);
}
}
return r;
}
};
Goodclass Solution {
public:
int numSubarrayBoundedMax(vector<int>& A, int L, int R) {
int r;
int c = 0;
int head = 0;
for (int i = 0; i < A.size(); i++) {
if (A[i] >= L && A[i] <= R) {
c += (head + 1);
r += c;
head = 0;
} else if (A[i] < L) {
r += c;
head++;
} else {
c = 0;
head = 0;
}
}
return r;
}
};
Best
class Solution {
public:
int numSubarrayBoundedMax(vector<int>& A, int L, int R) {
int result=0, left=-1, right=-1;
for (int i=0; i<A.size(); i++) {
if (A[i]>R) left=i;
if (A[i]>=L) right=i;
result+=right-left;
}
return result;
}
};
留言
張貼留言