o(n)的复杂度,使用双端队列,队列里由大到小排序、由旧到新排序。
旧于当前窗口的值删掉,只需从左开始遍历队列。
小于等于 当前最新的元素 的旧元素都删掉,这些又旧又小的元素用不到。从右开始遍历队列。
class Solution {
public:
vector<int> maxSlidingWindow(vector<int>& nums, int k) {
deque<int> q;
for(int i=0;i<k-1;i++){
while(!q.empty() && nums[q.back()]<nums[i]){
q.pop_back();
}
q.push_back(i);
}
vector<int> ans;
for(int i=k-1;i<nums.size();i++){
while(!q.empty() && q.front()<=i-k){
q.pop_front();
}
while(!q.empty() && nums[q.back()]<=nums[i])
q.pop_back();
q.push_back(i);
ans.push_back(nums[q.front()]);
}
return ans;
}
};