算法1
(单调递减队列) $O(n)$
技巧: 维护下标位置
每次; 看队列front的位置的下标是否已经不在窗口内,
同时使用当前值更新队列的back,踢掉当前队列中小的元素。
因为在前面的并且小的数一定 不会被用到。
C++ 代码
class Solution {
public:
vector<int> maxInWindows(vector<int>& nums, int k) {
int n = nums.size();
deque<int> que;
vector<int> ans;
for (int i = 0; i < n; ++i) {
while (que.size() && que.front() <= i - k) que.pop_front();
while (que.size() && nums[que.back()] <= nums[i]) que.pop_back();
que.push_back(i);
if (i >= k - 1) {
ans.push_back(nums[que.front()]);
}
}
return ans;
}
};