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;


    }
};