class Solution { public: vector<int> maxSlidingWindow(vector<int>& nums, int k) { // 优先队列做法 复杂度nlogn // emplace可以直接生成元素插入到优先队列中去 /*priority_queue<pair<int,int>> pq;//优先队列,大顶堆,以第一个元素作为key排序 for(int i = 0; i < k; ++i) pq.emplace(nums[i],i);//把前k个元素加入 vector<int> res = {pq.top().first};//保存好第一个滑动窗口的答案 for(int i = k; i < nums.size(); ++i) { //滑动窗口向后移动 pq.emplace(nums[i], i);//新加入一个元素 while(pq.top().second + k <= i) pq.pop();//判断当前最大的元素是否不在滑动窗口中,找到一个最大&在窗口中的 res.push_back(pq.top().first);//保存答案 } return res;*/ // acwing做法 复杂度n // 思考一下hint的做法,使用双端队列 // 双端队列的长度不等于k,只要考虑应该考虑的元素,而移除多余的元素 // 实际上就是一个单调双端队列 // 暴力+优化:删掉所有不可能成为答案的元素之后,惊奇的发现,这竟然是一个单调队列 deque<int> q;//单调双端队列记录下标 vector<int> res; for(int i = 0; i < nums.size(); ++i) { while(q.size() && i - k + 1 > q.front()) q.pop_front(); while(q.size() && nums[i] >= nums[q.back()]) q.pop_back(); q.push_back(i); if(i >= k - 1) res.push_back(nums[q.front()]); } return res; } };