● 239. 滑动窗口最大值(困难)
class Solution {
private:
class myQueue{
public:
deque<int> que;
void push(int val){
while(!que.empty()&&val>que.back()){
que.pop_back();
}
que.push_back(val);
}
void pop(int val){
if(!que.empty()&&que.front()==val){
que.pop_front();
}
}
int front(){
return que.front();
}
};
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.push(nums[i]);
que.pop(nums[i-k]);
result.push_back(que.front());
}
return result;
}
};
347.前 K 个高频元素
class Solution {
public:
class myCompare{
public:
bool operator()(pair<int,int>& h1,pair<int,int>& h2){
return h1.second>h2.second;
}
};
vector<int> topKFrequent(vector<int>& nums, int k) {
unordered_map<int,int> map;
for(int num:nums){
map[num]++; //map中统计每个元素出现频率简写法
}
priority_queue<pair<int,int>,vector<pair<int,int>>,myCompare> p_que;
for(unordered_map<int,int>::iterator it = map.begin();it!=map.end();it++){
p_que.push(*it);
if(p_que.size()>k){
// priority_queue 的 pop() 操作的时间复杂度是 O(log n),其中 n 是优先级队列中元素的数量。
// 在 priority_queue 中,插入元素和删除头部元素(即 push() 和 pop() 操作)时,会进行堆的调整以维持堆的性质。对于 pop() 操作,它会将堆顶的最高优先级元素移除,并重新调整堆。
p_que.pop();
}
}
//声明时初始化vector size
vector<int> result(k);
// result.resize(k); 也可
for(int i=k-1;i>=0;i--){
result[i]=p_que.top().first;
p_que.pop();
}
return result;
}
};