该题利用了单调队列(优先队列)辅助解题:
注:priority_queue 容器适配器为了保证每次从队头移除的都是当前优先级最高的元素,每当有新元素进入,它都会根据既定的排序规则找到优先级最高的元素,并将其移动到队列的队头;同样,当 priority_queue 从队头移除出一个元素之后,它也会再找到当前优先级最高的元素,并将其移动到队头。
vector<int> maxSlidingWindow(vector<int>& nums, int k) {
int n = nums.size();
priority_queue<pair<int, int>> q;//优先队列
for (int i = 0; i < k; ++i) {//先把前k个元素放入优先级队列中
q.emplace(nums[i], i);
}
vector<int> ans = {q.top().first};
for (int i = k; i < n; ++i) {
//每放入一个元素查看队顶元素是否在滑动窗口内,若不在pop直至队顶元素在滑动窗口内
q.emplace(nums[i], i);
while (q.top().second <= i - k) {
q.pop();
}
//此时队顶元素处于滑动窗口内,添加至ans
ans.push_back(q.top().first);
}
return ans;
}