思路:
用双端队列来维护这个滑动窗口,用res记录窗口内的最大值
分两步走,未形成滑动窗口时、形成滑动窗口时
未形成滑动窗口时
while判断当前的元素是否比window队尾的元素大,如果大就弹出队尾元素,直到元素为空为止,
window队头元素为滑动窗口的最大值索引,push_back到res结果中
形成滑动窗口后,i从k开始遍历
要维护窗口的大小,当队列不为空时,把下标小于i-k(窗口的前端下标)的元素弹出
同样用window维护滑动窗口中较大值的下标
window中元素在未形成滑动窗口时逐渐增大到k,形成后在0-k之间变动
class Solution {
public:
vector<int> maxSlidingWindow(vector<int>& nums, int k) {
if(k==0) return {};
vector<int> res;
deque<int>window;
//形成滑动窗口
for(int i =0;i<k;i++)
{//保证window存储较大的元素下标
while(!window.empty() && nums[i] >nums[window.back()])
{
window.pop_back();
}
window.push_back(i);
}
res.push_back(nums[window.front()]);
for(int i =k;i<nums.size();i++)
{
if(!window.empty() && window.front() <= i-k)
{//维护窗口的大小,小于窗口前下标i-k的移除
window.pop_front();
}
while(!window.empty() && nums[i] > nums[window.back()])
{//比较最后一个元素与当前nums[i]的大小,如果比nums[i]小就被替换掉
window.pop_back();
}
window.push_back(i);
res.push_back(nums[window.front()]);
}
return res;
}
};