题目来源
解题方法
双端队列deque
维护一个递减的双端队列,其队首一定是滑动窗口内的最大元素的下标,每次都新下标对应元素是否比队尾元素大,若是,则队尾元素出队列,判断队首元素下标是否不在滑动队列中了,若是则移除,接着移进来新元素
为什么要存下标呢
答:因为移动窗口的左右边界都是以下标定义的,这样非常直观
为什么要将队列中小于当前元素的元素全部移除呢
答:参考“篮球队长”:高三的为队长,则高一高二的都有机会,若高一的为队长,则高二高三都没有机会了,因为等到高一的升为高三时,高二高三都已经毕业了,因此同样的原理,移除不可能成为队首的元素减少判断次数
附上代码
class Solution {
public:
vector<int> maxSlidingWindow(vector<int>& nums, int k) {
vector<int> ans;
deque<int> deque;
for(int i=0;i<nums.size();i++){
// 筛选没有可能成为队首的元素
while(!deque.empty() && nums[i]>nums[deque.back()])
deque.pop_back();
// 若队首元素已经不在窗口内了,移除
if(!deque.empty() && deque.front() + k-1 < i)
deque.pop_front();
deque.push_back(i);
if(!deque.empty() && i>=k-1)
ans.push_back(nums[deque.front()]);
}
return ans;
}
};
收获
deque的使用