先把朴素算法想清楚,再分析性质,进而推进成一个具有单调性的栈或者队列。即单调栈/单调队列。(重要)
例题:leetcode239 单调队列实现滑动窗最大值
https://leetcode-cn.com/problems/sliding-window-maximum/submissions/
下面利用数组模拟一个队列。
(1)hh 队列左端点,tt队列右端点
(2)[hh,tt]双闭区间,代表队列中有效区间。因此 ,hh>tt时,代表队列为空。
#define N 100050
int a[N];
vector<int> maxSlidingWindow(vector<int>& nums, int k) {
int hh = 0, tt = -1;//hh队列 左端点 tt队列 右端点
vector<int> ans;
for (int i = 0; i < nums.size(); i++){
if (tt >= hh && a[hh] < i - k + 1) hh++;
while (tt>=hh &&nums[a[tt]] <= nums[i])tt--;
a[++tt] = i;
if (i >= k - 1)
ans.push_back(nums[a[hh]]);
}
return ans;
}