题目:前 K 个高频元素
思路:先使用**哈希表将每个数字与出现频率对应,再通过频率大小在最小堆中筛选出前 k 个高频元素,最后将堆中的频率对应的数字存入数组**并输出
唯一要注意的是 pq 中存储的元素,不能只存储频率,而是要将频率与对应的数字绑定,不然最后会导致只知道”前 k 大的频率“,而不是”前 k 个高频元素“;这里使用的是 pair,比较器只会比较频率的大小,这样我们就能找到频率所对应的元素,并将其存入 res 数组
1vector<int> topKFrequent(vector<int>& nums, int k)
2{
3 std::unordered_map<int, int> um;
4 for(int num : nums)
5 {
6 um[num]++;
7 }
8
9 auto cmp = [](const std::pair<int, int>& a, const std::pair<int, int>& b)
10 {
11 return b.first < a.first;
12 };
13 std::priority_queue<std::pair<int, int>, vector<std::pair<int, int>>, decltype(cmp)> pq;
14 for(const auto& pair : um)
15 {
16 pq.emplace(pair.second, pair.first);
17 if(k < pq.size())
18 pq.pop();
19 }
20
21 std::vector<int> res;
22 res.reserve(k);
23 while(!pq.empty())
24 {
25 res.push_back(pq.top().second);
26 pq.pop();
27 }
28 return res;
29}