原题链接//https://ac.nowcoder.com/acm/problem/51001
题意:给定一个数组,给你一个长度为k的窗口,窗口每次向右滑动一个位置,求每次滑动后窗口里最大/最小的数。
示例:
思路1:优先队列
最大值:维护一个长度为k的优先队列(pair类型,pair类型的优先队列排序是先按照first排序,再按照second序),那我们就可以定义一个priority_queue<pair<a[i], i> >, 当窗口移动后我们判断队列的头元素的second是否还在窗口中(移动窗口后,以前的元素可能已不再窗口内), 若在就将新元素加入到队列中,若不在就先将队首出列,然后再将新元素加入到队列中。这样每次输出队列的首元素的first即可。
最小值:同理建一个小顶堆,priority_queue<pair<int,int>,vector<pair<int,int> >,greater<pair<int,int> > >,可求出每次窗口移动的最小值。
时间复杂度:从前往后遍历每个元素,复杂度为O(n),元素入队的复杂度为O(logn)(堆的操作为O(logn)),总复杂度为O(nlogn)。
代码:
priority_queue<pair<int,int> > pq1; //大顶堆
priority_queue<pair<int,int>,vector<pair<int,int> >,greater<pair<int,int> > > pq2; //小顶堆
vector<int> v1, v2; //存储最大值 最小值
void Sliding_Window(int a[], int n, int k)
{