239. 滑动窗口最大值
class MyQueue {
public:
deque<int> que;
void pop(int value) {
if(!que.empty()&&que.front()==value){
que.pop_front();
}
}
void push(int value) {
while(!que.empty()&&value>que.back()){
que.pop_back();
}
que.push_back(value);
}
int front() {
return que.front();
}
};
class Solution {
public:
vector<int> maxSlidingWindow(vector<int>& nums, int k) {
MyQueue que;
vector<int> result;
for(int i=0;i<k;i++){
que.push(nums[i]);
}
result.push_back(que.front());
for(int i=k;i<nums.size();i++){
que.pop(nums[i-k]);
que.push(nums[i]);
result.push_back(que.front());
}
return result;
}
};
347. 前K个高频元素
题目链接
**题解:**要注意小顶堆的写法,仔细看看,
priority_queue优先队列有三个参数,其声明形式为:priority_queue< type, container, function>;
type:数据类型;
container:实现优先队列的底层容器,必须是可随机访问的容器,例如vector、deque,而不能使用list;
function:元素之间的比较方式;
操作函数:
bool empty() const :返回值为true,说明队列为空;
int size() const :返回优先队列中元素的数量;
void pop() :删除队列顶部的元素,也即根节点
int top() :返回队列中的顶部元素,但不删除该元素;
void push(int arg):将元素arg插入到队列之中;
class Solution {
public:
// 小顶堆
class mycomparison {
public:
bool operator()(const pair<int,int> &left, const pair<int,int> &right){
return left.second>right.second;//小顶堆左大于右
}
};
vector<int> topKFrequent(vector<int>& nums, int k){
unordered_map<int,int> map;
for(int i=0;i<nums.size();i++){
map[nums[i]]++;
}
priority_queue<pair<int,int>,vector<pair<int,int>>,mycomparison> que;
for(unordered_map<int,int>::iterator it=map.begin();it!=map.end();it++){//注意迭代器的语法
que.push(*it);
if(que.size()>k){
que.pop();
}
}
vector<int> result;
for(int i=0;i<k;i++){
result.push_back(que.top().first);//priority队列的函数有哪些
que.pop();
}
return result;
}