-
STL中的堆为priority_queue,直译为优先队列,也就是大根堆
堆顶元素为最大值
priority_queue<pair<int, int>> q;
q.top() 存放最大值 -
堆中元素同时记录值和在数组中的索引,有利于进行判断滑动窗口是否已经滑出有限范围
流程
3. 向滑动窗口中添加k个元素
本题中第一步 堆中即保存1,3,-1以及对应的索引(加入pair类型元素)
- 从数组中的第k+1个数nums[k]起,向后扫描
即指针i从k索引开始,每次循环向后移动一位
每次循环对应一个滑动窗口的位置
在循环内需要执行一下操作:
- 加入pair<int, int>
- 如果堆顶的元素在滑动窗口之外,需要弹出
- 不断弹出在窗口外的堆顶元素,最后剩下的就是当前队列中的最大值,输出打印
class Solution {
public:
vector<int> maxSlidingWindow(vector<int>& nums, int k) {
priority_queue<pair<int, int>> h;
vector<int> ans;
// 构建滑动窗口
for(int i=0; i<k; i++){
h.push({nums[i], i});
}
ans.push_back(h.top().first);
//移动滑动窗格
int n = nums.size();
for(int i=k; i<n; i++){
h.push({nums[i], i});
while(h.top().second<i-k+1) h.pop();
ans.push_back(h.top().first);
}
return ans;
}
};