Ps: 实现一个窗口内的最大值与最小值更新结构,使用双端队列。
这里以数组内有多少组两数之差小于特定的number为例。
class Solution {
public:
int getNum(vector<int> arr, int num) {
if (arr.size() == 0) return 0;
// 使用双端队列
deque<int> dq_min;
deque<int> dq_max;
int i = 0;
int j = 0;
int res = 0;
while (i < arr.size()) {
while (j < arr.size()) {
// 窗口最小值更新结构
while (!dq_min.empty() && dq_min.back() >= arr[i]) {
dq_min.pop_back();
}
dq_min.push_back(j);
// 窗口最大值更新结构
while (!dq_max.empty() && dq_max.back() <= arr[i]) {
dq_max.pop_back();
}
dq_max.push_back(j);
if (arr[dq_max.front()] - arr[dq_min.front()] > num) {
break;
}
j++;
}
// 弹出结构
if (dq_min.front() = i) {
dq_min.pop_front();
}
if (dq_max.front() == i) {
dq_max.pop_front();
}
res += j - i; // 窗口最大值- 窗口最小值 <= num , 窗口内更小于
i++;
}
return res;
}