代码随想录刷题随记11-滑动窗口和优先级队列
239. 滑动窗口最大值
leetcode链接
考察滑动窗口的结构
解题代码:
class Solution {
public:
vector<int> maxSlidingWindow(vector<int>& nums, int k) {
vector<int>ret;
deque<int> slidwindow;
for(int i=0;i<nums.size();i++){
while(!slidwindow.empty()&&nums[i]>=nums[slidwindow.back()]){
slidwindow.pop_back();
}
slidwindow.push_back(i);
while(i-slidwindow.front()+1>k){
slidwindow.pop_front();
}
if(i+1>=k)
ret.push_back(nums[slidwindow.front()]);
}
return ret;
}
};
347.前 K 个高频元素
leetcode 链接
利用小根堆解决前k个的问题,统计频率利用map记录每个数出现了几次
使用小根堆而不是大根堆实现,可以避免对所有的都排序,只对k个进行排序
class Solution {
public:
class mycompaire{
public:
bool operator () (pair<int,int> left,pair<int,int> right){
return left.second>right.second;
}
};
vector<int> topKFrequent(vector<int>& nums, int k) {
priority_queue<pair<int,int>, vector<pair<int, int>>,mycompaire>minheap;
unordered_map<int,int> map;
for(int i=0;i<nums.size();i++){
if(map.find(nums[i])!=map.end()){
map[nums[i]]++;
}
else{
map[nums[i]]=0;
}
}
for( auto it:map){
minheap.push(it);
if(minheap.size()>k){
minheap.pop();
}
}
vector<int> ret(k,0);
for(int i=k-1;i>=0;i--){
ret[i]=minheap.top().first;
minheap.pop();
}
return ret;
}
};