队列应用 lc239 滑动窗口最大值
本题可以使用队列来记录窗口,但是想要记录最大值,则需要使用单调队列,而且我们只需要维护大值。
在添加元素时,先将比要添加元素小且在尾部的元素全部弹出,再添加元素。
class Solution {
private:
class MyQueue{
public:
deque<int> que;
void pop(int n){
if(!que.empty() && n == que.front()){
//cout<<"out "<<que.front()<<endl;
que.pop_front();
}
}
void push(int n){
//先从尾部弹出所有小于n的值
while(!que.empty() && que.back() < n){ //注意这里必须是小于,小于等于的话会造成误弹出,少一个元素
//cout<<"outback "<<que.back()<<endl;
que.pop_back();
}
que.push_back(n);
//cout<<"in "<<que.back()<<endl;
}
int getMaxValue(){
return que.front();
}
};
public:
vector<int> maxSlidingWindow(vector<int>& nums, int k) {
vector<int> result;
MyQueue window;
for(int i=0;i<k;i++){
window.push(nums[i]);
}
//cout<<"finish initial"<<endl;
result.push_back(window.getMaxValue());
for(int i=k;i<nums.size();i++){
window.pop(nums[i-k]);
window.push(nums[i]);
result.push_back(window.getMaxValue());
}
return result;
}
};
优先级队列 lc347 前k个高频元素
本题有以下前置知识需要掌握
- 大小顶堆,自定义优先级队列
- 运算符重载,仿函数写法
优先级队列不错的讲解:
c++优先队列(priority_queue)用法详解 - 华山青竹 - 博客园 (cnblogs.com)
class Solution {
public:
//因为将使用自定义数据类型,且需要小顶堆,将运算符进行重载,使用仿函数写法
class mycomparison{
public:
bool operator()(const pair<int,int>& lhs, const pair<int,int>& rhs){
return lhs.second>rhs.second;
}
};
vector<int> topKFrequent(vector<int>& nums, int k) {
//使用map记录每个数字出现次数
unordered_map<int,int> map;
for(int i=0;i<nums.size();i++){
map[nums[i]]++;
}
//创建一个小顶堆来进行排序(只需要维护k个)
priority_queue<pair<int,int>, vector< pair<int,int> >, mycomparison> pri_que;
//将map中的键值对放入小顶堆,且只维护k个组
for(auto iter = map.begin(); iter != map.end(); iter++){
pri_que.push(*iter);
if(pri_que.size() > k){
pri_que.pop();
}
}
//进行输出,为了美观,从出现频率最高的数字开始输出
vector<int> result(k);
for(int i = k-1;i>=0;i--){
result[i] = pri_que.top().first;
pri_que.pop();
}
return result;
}
};
标签:347,第十二天,map,int,随想录,pri,队列,vector,que
From: https://www.cnblogs.com/frozenwaxberry/p/17067935.html