2020-05-11
1.题目描述
滑动窗口的最大值
2.题解
使用双端队列维护一个递减的队列
3.代码
class Solution {
public:
vector<int> maxSlidingWindow(vector<int>& nums, int k) {
vector<int> res;
int l=nums.size();
if (!l) return res;
deque<int> myqueue; // 双端队列
for (int i=0;i<l;i++){ // 维护一个递减的队列,存放的是元素所对应的下标
if (!myqueue.empty()&&myqueue.front()<=i-k){
myqueue.pop_front(); // 当前最大的元素的下标不属于当前滑动窗口内
}
while(!myqueue.empty()&&nums[myqueue.back()]<=nums[i]){ // 队列中小于当前值的元素出队列
myqueue.pop_back();
}
myqueue.push_back(i); // 进队列
if (i>=k-1) res.push_back(nums[myqueue.front()]);
}
return res;
}
};
class Solution {
public:
vector<int> maxSlidingWindow(vector<int>& nums, int k) {
vector<int> res;
int l=nums.size();
deque<int> myque; // 维护一个递减的队列
for (int i=0;i<l;i++){
while (!myque.empty()&&nums[myque.back()]<=nums[i]){
myque.pop_back(); // 出队列
}
myque.push_back(i); // 入队列
if (myque.front()<=i-k) myque.pop_front();
if (i>=k-1) res.push_back(nums[myque.front()]);
}
return res;
}
};