给你一个整数数组 nums 和一个整数 k ,请你返回其中出现频率前 k 高的元素。你可以按 任意顺序 返回答案。
示例 1:
输入: nums = [1,1,1,2,2,3], k = 2 输出: [1,2]
示例 2:
输入: nums = [1], k = 1 输出: [1]
- class Solution {
- public:
- // 小顶堆
- class mycomparison {
- public:
- bool operator()(const pair<int, int>& lhs, const pair<int, int>& rhs) {
- return lhs.second > rhs.second;
- }
- };
- vector<int> topKFrequent(vector<int>& nums, int k) {
- // 统计元素出现频率
- map<int,int> mp;
- for(int i=0;i
size();i++) { - mp[nums[i]]++;
- }
-
- // 对频率排序,定义一个小顶堆,大小为k
- priority_queue
int,int>,vectorint, int>>,mycomparison> pri_que; - // 用固定大小为k的小顶堆,扫面所有频率的数值
- for(map<int,int>::iterator it=mp.begin();it!=mp.end();it++) {
- pri_que.push(*it);
- if(pri_que.size() > k) pri_que.pop();
- }
-
- // 找出前K个高频元素,因为小顶堆先弹出的是最小的,所以倒序来输出到数组
- vector<int> result(k);
- for(int i = k-1;i>=0;i--) {
- result[i] = pri_que.top().first;
- pri_que.pop();
- }
- return result;
- }
- };
- // 时间复杂度: O(nlogk)
- // 空间复杂度: O(n)
-
- // nums = [1,1,1,2,2,3], k = 2
- // 1:3
- // 2:2
- // 3:1
-
- // 1
- // 3 2