LeetCode 239. 滑动窗口最大值
class Solution {
public:
class MyQueue{
public:
deque<int> q;
void pop(int x){
if(!q.empty() && q.front()==x){
q.pop_front();
}
}
void push(int x){
while(!q.empty() && x>q.back()){
q.pop_back();
}
q.push_back(x);
}
int getfront(){
return q.front();
}
};
vector<int> maxSlidingWindow(vector<int>& nums, int k) {
MyQueue q;
vector<int> result;
for(int i=0;i<k;i++){
q.push(nums[i]);
}
result.push_back(q.getfront());
for(int i=k;i<nums.size();i++){
q.pop(nums[i-k]);
q.push(nums[i]);
result.push_back(q.getfront());
}
return result;
}
};
- deque是一个双端队列,前后都可以弹出。
- 整体思路只维护动窗口中最大值
- 设计Myqueue时,push每次会将队列中小于插入值x的全部弹出,再插入x
- 具体执行时,每次先删除nums[i-k],就是每一次离开滑动窗口的值,在Myqueue的pop中实现
LeetCode 347. 前 K 个高频元素
class Solution {
public:
class mycmp{
public:
bool operator()(const pair<int,int> &a,const pair<int,int> &b){
return a.second>b.second;
}
};
vector<int> topKFrequent(vector<int>& nums, int k) {
priority_queue<pair<int,int>,vector<pair<int,int>>,mycmp> pri_que;
unordered_map<int,int> map;
for(int n:nums){
map[n]++;
}
for(auto x:map){
pri_que.push(x);
if(pri_que.size()>k){
pri_que.pop();
}
}
vector<int> result;
for(int i=0;i<k;i++){
result.push_back(pri_que.top().first);
pri_que.pop();
}
return result;
}
};
这一题主要是要把迭代,priority_queue,unordered_map这些操作搞懂。
总结
跟上节奏,自己下去有时间还要把栈,队列相关容器,deque是否连续这些是什么意思搞懂。