您的位置:首页 > 理论基础 > 数据结构算法

数据结构和算法经典100题-第33题

2016-01-03 15:28 459 查看
最大值减去最小值小于或等于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;
}


路漫漫其修远兮,吾将上下而求索…
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息