(写给未来遗忘的自己)
题目:
代码:
class Solution {
public:
//构建一个比较器类 用于比较pair<int,int>类型的对象
class comparison{
public:
bool operator()(const pair<int,int>&key_map,const pair<int,int>&value_map){
//优先队列的排序原则:优先队列的比较器返回true的含义是:左边的元素应该排在右边的元素之后
return key_map.second>value_map.second;
}
};
vector<int> topKFrequent(vector<int>& nums, int k) {
vector<int>result(k);
//用一个map去处理数组,key存储值,value存储次数;
std::unordered_map<int,int>map_nums;
for(int i=0;i<nums.size();i++){
map_nums[nums[i]]++;
}
//自定义一个优先队列 小顶堆
std::priority_queue<pair<int,int>,vector<pair<int,int>>,comparison>que;】
for(unordered_map<int,int>::iterator it=map_nums.begin();it!=map_nums.end();it++){
//it是迭代器,*it 解引用迭代器,获取指向的元素 pair<int,int>
que.push(*it);
//维持前k个最大的元素 pop是从栈顶端开始的,所以小顶堆每次弹出的是最小的
if(que.size()>k){
que.pop();
}
}
for(int i=k-1;i>=0;i--){
result[i]=que.top().first;
que.pop();
}
return result;
}
};
思路:
1.寻找出现次数最多的元素哦,利用map类型的数据,key存储数据,value存储出现的次数。
2.自定义一个pair<int,int>类型的小顶堆,书写比较器。将按照value进行排序,然后取key的值即为目标值。