239. 滑动窗口最大值(难)
class MyQueue{
public:
deque<int>que;
//弹出队头元素
void pop(int value){
while(!que.empty()&&que.front()==value){
//que.front()==value的必要性:为维护单调队列,内部会自动弹出头部元素,因此主函数中并不是每次移动窗口一定会操作弹出
que.pop_front();
}
}
//压入元素大于单调队列最大值,前面元素全部弹出
void push(int value){
while(!que.empty()&&value>que.back()){
que.pop_back();
}
que.push_back(value);
}
//返回头部最大值
int front(){
return que.front();
}
};
class Solution {
public:
vector<int> maxSlidingWindow(vector<int>& nums, int k) {
MyQueue que;//单调队列
vector<int>result;
//形成第一个窗口,记录最大值
for(int i=0;i<k;i++){
que.push(nums[i]);
}
result.push_back(que.front());
//窗口数:数组长-k+1
for(int i=k;i<nums.size();i++){
//弹出第一个元素,加入下一个进入滑动窗口的元素
que.pop(nums[i-k]);
que.push(nums[i]);
result.push_back(que.front());
}
return result;
}
};
- 实现一个单调队列,队列中元素从大到小,front就是窗口里的最大值
- 一定要先判断栈空!
347. 前k个高频元素(明天补)