滑动窗口的最大值
力扣题目详情:
解题思路:
1、使用一个优先队列用来存储窗口中的数字,插入时会排序。
2、使用一个优先队列用来存储离开窗口的数字。
3、遍历数组,超过k个元素时,开始将窗口中的最大值(即优先队列的top)存入返回值。
4、如果窗口中和离开窗口两个优先队列中最大的值相同,说明可以删除了。循环处理可以删除的数值。
5、否则,就算有已经过期的数字还在窗口中存储,但是不影响最大值,所以不用担心。
6、遍历结束,返回结果。
代码实现
class Solution {
public:
vector<int> maxSlidingWindow(vector<int>& nums, int k) {
vector<int> answer;
priority_queue<int> del_queue;
priority_queue<int> cur_queue;
for (size_t i = 0; i < nums.size(); i++)
{
cur_queue.push(nums[i]);
if (i < k - 1) continue;
answer.push_back(cur_queue.top());
del_queue.push(nums[i - k + 1]);
while (!cur_queue.empty() && !del_queue.empty() && cur_queue.top() == del_queue.top())
{
cur_queue.pop();
del_queue.pop();
}
}
return answer;
}
};