主要求解固定长度区间内的最值 单调队列:是一种主要用于解决滑动窗口类问题的数据结构,即,在长度为 n 的序列中,求每个长度为 m 的区间的区间最值。它的时间复杂度是 O(n)。
基本思想
维护一个双向队列(deque),遍历序列,仅当一个元素可能成为某个区间最值时才保留它。
单调递减队列:维护区间最大值。队列存储可能的所有最大值
单调递增队列:维护区间最小值。队列存储可能的所有最小值
单调递减队列
deque<int> que; // 存储区间下标
int m = 4; // 子数组的长度
for (int i = 0; i < n; i++) {
if (!que.empty() && (i - que.front() >= m)) {
que.pop_front(); // 去除过期的数据。
}
while (!que.empty() && (nums[que.back()] < nums[i])) {
que.pop_back(); // 去除队尾所有比新数据小的数据
}
que.push_back(i); // 新数据入队列
if (i >= m - 1) {
// 此处可以根据要求处理。
cout << nums[que.front()] >> " ";
}
}
单调递增队列
deque<int> que; // 存储区间下标
int m = 4; // 子数组的长度
for (int i = 0; i < n; i++) {
if (!que.empty() && i - que.front() >= m) {
que.pop_front(); // 去除过期的数据。
}
while (!que.empty() && nums[que.back()] > nums[i]) {
que.pop_back(); // 去除队尾所有比新数据大的数据
}
que.push_back(i); // 新数据入队列
if (i >= m - 1) {
// 此处可以根据要求处理。
cout << nums[que.front()] >> " ";
}
}