
滑动窗口最大值,刚看到,一种朴素的思想扑面而来,就是优先队列+map,是可以解决这个问题的,就是空间复杂度稍高,并且不优雅,并且 O(NlogN)
一种更为优雅的做法是单调队列,这个就稍微比较考验技巧了,如果是第一次听说,最好还是全文背诵。。。

这里,存下标的原因是,由于我们可能会把队里的元素删光,所以不知道最前面的是不是该被删的老的,还是新放的,放下标的处理会更为简单,代码如下:
cpp
typedef vector<int> V;
class Solution {
public:
vector<int> maxSlidingWindow(vector<int>& nums, int k) {
deque<int> q;
V ans;
int n = nums.size();
for(int i=0;i<n;i++)
{
int num = nums[i];
while(q.size() > 0 && nums[q.back()] <= num)q.pop_back();
while(q.size() > 0 && q.front() <= i-k)q.pop_front();
q.push_back(i);
if(i>=k-1)
ans.push_back(nums[q.front()]);
}
return ans;
}
};