前K个高频元素
- 题解1 大根堆(STL)
给你一个整数数组
nums
和一个整数
k
,请你返回其中出现频率前
k
高的元素。你可以按 任意顺序 返回答案。
示例 1:
输入: nums = [1,1,1,2,2,3], k = 2
输出: [1,2]
示例 2:
输入: nums = [1], k = 1
输出: [1]
提示:
- 1 <=
nums.length
<= 1 0 5 10^5 105 k
的取值范围是 [1, 数组中不相同的元素的个数]- 题目数据保证答案唯一,换句话说,数组中前
k
个高频元素的集合是唯一的
进阶:你所设计算法的时间复杂度 必须 优于
O
(
n
l
o
g
n
)
O(n log n)
O(nlogn) ,其中 n
是数组大小。
题解1 大根堆(STL)
class Solution {
public:
// 定义pair比较规则
struct cmp {
bool operator()(const pair<int, int>& a, const pair<int, int>& b){
return a.second > b.second;
}
};
/** 或者
// 解释一下为什么用static:传入的函数指针为void类型,如果不是static会默认带this指针,这样与void类型不匹配
static bool cmp(pair<int, int>& m, pair<int, int>& n) {
return m.second > n.second;
}
**/
vector<int> topKFrequent(vector<int>& nums, int k) {
priority_queue<pair<int, int>, vector<pair<int, int>>, cmp> pq;
map<int, int> ff;
vector<int> ret(k);
// 记次数(也可以先排序)
for(auto& i : nums){
ff[i] ++;
}
// 同前K个最大值(只不过这次是比次数)
for(auto& i : ff){
pq.push(make_pair(i.first, i.second));
if(pq.size() > k)
pq.pop();
}
// 放回ret
for(int i = 0; i < k; i++){
ret[i] = pq.top().first;
pq.pop();
}
return ret;
}
};