题目:前 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}