栈与队列part03
1.记得补滑动窗口最大值
题目https://leetcode.cn/problems/sliding-window-maximum/
2.前k个高频元素
题目https://leetcode.cn/problems/top-k-frequent-elements/
题解:
class Solution {
public:
class mycomparison{
public://小顶堆,根节点是最小频率的元素;当元素数量超过k时,先弹出根节点(频率低的)
bool operator()(const pair<int, int>& lhs, const pair<int, int>& rhs) {
return lhs.second>rhs.second;//map<元素数值,元素出现频率>
}
};
vector<int> topKFrequent(vector<int>& nums, int k) {
unordered_map<int,int>map;//map<元素数值,元素出现频率>
for(int i=0;i<nums.size();i++){
map[nums[i]]++;//遇到一个元素,其频率就加1
}
priority_queue<pair<int, int>, vector<pair<int, int>>, mycomparison> pri_que;
//定义小顶堆,大小为k
for(unordered_map<int, int>::iterator it = map.begin(); it != map.end(); it++){
pri_que.push(*it);
if(pri_que.size()>k){//元素数量超过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;
}
};
盲点:
1.例如我们在写快排的cmp函数的时候,return left>right
就是从大到小,return left<right
就是从小到大
bool cmp(Range a,Range a){
return a.right<a.right;//按区间结束位置从左到右(从小到大)排序
}
sort(a, a+n, cmp)
优先级队列的定义正好反过来了
public://小顶堆,根节点是最小频率的元素;当元素数量超过k时,先弹出根节点(频率低的)
bool operator()(const pair<int, int>& lhs, const pair<int, int>& rhs) {
return lhs.second>rhs.second;//从小到大
}
3.小顶堆pta
最优合并问题
题目PTA | 程序设计类实验辅助教学平台 (pintia.cn)
降低时间复杂度,不用调用sort