最大值减去最小值小于或等于num的子数组的数量
题目要求:
给定数组srr和整数num,返回共有多少满足如下条件的子数组?
max{arr[i…j]} - min{arr[i…j]} <= num
max{arr[i…j]}表示数组arr[i…j]中最大的值
min{arr[i…j]}表示数组arr[i…j]中最大的值
说明:
如果数组的长度为N,请实现时间复杂度为O(N)的算法
题目解析:
看此题前请看一下上一题33题。
因为发现木有啥人在看,所以直接给出代码了:
no code say what:
int getNum(const vector<int> &arr, const int num) {
if (arr.empty() || 0 >= num ) {
return -1;
}
int i = 0;
int j = 0;
int res = 0;
deque<int> qmax;
deque<int> qmin;
int len = (int)arr.size();
while (i < len) {
while (j < len) {
while (!qmin.empty() && arr[qmin.back()] > arr[j]) {
qmin.pop_back();
}
qmin.push_back(j);
while (!qmax.empty() && arr[qmax.back()] < arr[j]) {
qmax.pop_back();
}
qmax.push_back(j);
if (arr[qmax.front()] - arr[qmin.front()] < num) {
break;
}
j++;
}
if (qmax.front() == i) {
qmax.pop_front();
}
if (qmin.front() == i) {
qmin.pop_front();
}
res += j - i;
i++;
}
return res;
}
路漫漫其修远兮,吾将上下而求索…