题目就是要求我们维护一个滑动窗口,将窗口从头移动到尾,返回每次移动后窗口内的最大值。
思路是构造一个单调队列,这个队列是由链表组成(这样好修改)同时队列是递减的。里边保存的是潜在的最大值。
时间复杂度:O(n)
空间复杂度:O(k)
class MonotonicQueue
{//这是一个单调递减队列,队列头部为最大的元素
public:
list<int> lickedList;
void push(int n)
{
while(!lickedList.empty() && lickedList.back()<n)
{
lickedList.pop_back();
}
lickedList.push_back(n);
}
int max()
{
return lickedList.front();
}
void pop(int n)
{
if(lickedList.front()==n)
lickedList.pop_front();
}
};
vector<int> maxSlidingWindow(vector<int>& nums, int k)
{
vector<int> res;
MonotonicQueue window;
for(int i=0;i<k-1;i++)
{
window.push(nums[i]);
}
for(int i=k-1;i<nums.size();i++)
{
window.push(nums[i]);
res.push_back(window.max());
window.pop(nums[i-k+1]);
}
return res;
}