前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();}// 放回retfor(int i = 0; i < k; i++){ret[i] = pq.top().first;pq.pop();}return ret;}
};