一、题目描述:
leetcode 239.Sliding Window Maximum: 给定一个整数数组nums,有一个大小为k的滑动窗口,它从数组的最左边移动到最右边。你只能在窗口中看到k数字。每次滑动车窗向右移动一个位置。返回滑动窗口的最大值。
二、思路分析:
1.类别
单调栈、双端队列
2.做题思路
这一题需是典型的运用单调栈和双端队列来解决的题目。用STL中的deque定义双端队列s,从左到右遍历nums,当s不为空并且队尾的元素作为index的nums值小于遍历值,就pop队尾元素。然后将当前的index加入双端队列,然后用s.front()==i-k的判断保证窗口的大小固定。当当前的index已经超过k之后,就在返回的vector中加入当前的最大值。注意最大值永远会在队头,这就是单调栈的作用。
三、AC 代码:
class Solution {
public:
vector<int> maxSlidingWindow(vector<int>& nums, int k) {
vector<int> res;
deque<int> s;
for(int i=0;i<nums.size();i++){
while(!s.empty()&&nums[s.back()]<=nums[i]){
s.pop_back();
}
s.push_back(i);
if(s.front()==i-k){
s.pop_front();
}
if(i+1>=k){
res.push_back(nums[s.front()]);
}
}
return res;
}
};
四、总结
双端队列deque
- 支持高效插入和删除容器的头部元素
- 从头尾增加元素
void push_front(const T& x):队头增加一个元素Xvoid push_back(const T& x):队尾增加一个元素x
- 从头尾删除元素
void pop_front():删除双端队列中最前一个元素void pop_back():删除双端队列中最后一个元素
本文正在参与「掘金 2021 春招闯关活动」, 点击查看 活动详情