思路:
- 遍历数组建哈希表,哈希表的键存放数组的值,哈希表的值代表键值在数组中出现的次数;
- 遍历哈希表,将哈希表每个元素的键值颠倒后放入大根堆。因为我们要利用大根堆来求出现次数最多的元素,所以要把出现次数放在前面,元素本身的值放在后面;
- 最后循环
k
次,从大根堆堆顶取出元素的值。
class Solution {
public:
vector<int> topKFrequent(vector<int>& nums, int k) {
vector<int> res;
if (nums.empty()) return res;
unordered_map<int, int> hash;
priority_queue<pair<int, int>> q;
for (int& num : nums) hash[num] ++ ; //用哈希表统计每个数字出现的次数
//将哈希表元素颠倒后存入大根堆,元素出现的次数排在前面
for (auto& item : hash) q.push(make_pair(item.second, item.first));
while (k -- ) //遍历k次,取出高频元素
{
res.push_back(q.top().second);
q.pop();
}
return res;
}
};