题目描述
给定一个非空的整数数组,返回其中出现频率前 k 高的元素。
示例 1:
输入: nums = [1,1,1,2,2,3], k = 2 输出: [1,2]
示例 2:
输入: nums = [1], k = 1 输出: [1]
说明:
- 你可以假设给定的 k 总是合理的,且 1 ≤ k ≤ 数组中不相同的元素的个数。
- 你的算法的时间复杂度必须优于 O(n log n) , n 是数组的大小。
问题分析
先遍历数组,把数组中的数存入红黑树map中,这样在遍历结束后,map中就保存了数和该数出现的次数。然后我们创建一个优先级队列,把map中的数的出现次数放在前,数放在后组成pair,然后把pair都存入优先级队列中,该优先级队列会按照pair中第一个数的大小进行排序,所以都存入后,我们把优先级队列中从头部取出K个pair,按取出的顺序把他们的第二个元素存入答案数组ans中,并返回ans。
代码实现
class Solution {
public:
vector<int> topKFrequent(vector<int>& nums, int k) {
vector<int> ans;
map<int, int> m;
for(int i : nums)
++m[i];
priority_queue<pair<int, int>> pq;
for(auto it = m.begin(); it != m.end(); it++){
pq.push(make_pair(it->second, it->first));
}
for(int i = 0; i < k; i++){
ans.push_back(pq.top().second);
pq.pop();
}
return ans;
}
};