题目名称:活动窗口最大值
原题链接:https://leetcode.cn/problems/sliding-window-maximum/description/
本题的题意是说有一个大小为k的滑动窗口,每次会向右移动一格,求每移动一次时滑动窗口内的元素最大值,将这个最大值加入一个数组中,然后返回这个数组。
我们可以通过一个双端队列deque来实现滑动窗口的效果,即尾进头出。
首先我们定义一个动态数组ans用来存储结果,一个双端队列a来实现滑动窗口,接着进入循环。
在循环内部,使用if(!a.empty()&&a.front()==i-k){ a.pop_front(); }
来移除队列前端的索引已经不在当前窗口范围内的元素,即过期元素。然后是在将当前元素加入队列之前,移除队列中所有小于当前元素的索引,以确保队列中的元素始终按照从大到小的顺序排列。当窗口形成,将队列前端的元素加入结果数组 ans。
ac代码
class Solution {
public:vector<int> maxSlidingWindow(vector<int>& nums, int k) {deque <int> a;vector <int> ans;for(int i=0;i<nums.size();i++){if(!a.empty()&&a.front()==i-k){a.pop_front();}while(!a.empty()&&nums[a.back()]<nums[i]) {a.pop_back();}a.push_back(i);if(i>=k-1) ans.push_back(nums[a.front()]);}return ans;}
};