给你一个整数数组?nums
,有一个大小为?k
?的滑动窗口从数组的最左侧移动到数组的最右侧。你只可以看到在滑动窗口内的?k
?个数字。滑动窗口每次只向右移动一位。
返回?滑动窗口中的最大值?。
解法:单调队列经典题目,保持一个单调递增或者单调递减的队列,让队头永远是当前窗口的最大值或者最小值,那么有这样的性质,后面遍历的元素,只有比窗口的所有元素小,才能入队,否则将窗口里所有比他小的出队,才能保证队头永远是当前窗口的最大值或者最小值。
class Solution {
public:
vector<int> maxSlidingWindow(vector<int>& nums, int k) {
int q[100010];
int hh = 0,tt = -1;
vector<int>ans;
for(int i =0;i<nums.size();i++){
if(hh<=tt&&i-q[hh]>=k)hh++;
while(hh<=tt&&nums[i]>=nums[q[tt]])tt--;
q[++tt]=i;
if(i>=k-1)ans.push_back(nums[q[hh]]);
}
return ans;
}
};