美文网首页
LeetCode 347 前 K 个高频元素

LeetCode 347 前 K 个高频元素

作者: 萨缪 | 来源:发表于2019-10-31 19:37 被阅读0次

347. 前 K 个高频元素

这次是求前K个高频元素,同理,用堆其实最好解决,具体的步骤是:
1.先建立一个hash_map元素映射来映射数组中元素出现的次数,与数组元素一一对应
2.创建一个小根堆,遍历这个哈希表的每一个key把这个哈希表中的key和value成对插入小根堆中,那么该堆的顶部元素即为出现次数最多的元素。(因为小根堆内部的排序是根据出现次数num来排的),因为multimap 是个键值对,他内部会根据key来升序排列。key是数组中元素的大小,不是出现的次数。
3.从顶部依次输出堆中的元素即可。

multimap详解
unordered_map的三个特点:

  • 关联性:std::unorederd_map 是一个关联容器,其中的元素根据键来引用,而不是根据索引来引用。

  • 无序性:在内部,std::unordered_map中的元素不会根据其键值或映射值按任何特定顺序排序,而是根据其哈希值组织到桶中,以允许通过键值直接快速访问各个元素(常量的平均时间复杂度)。

  • 唯一性:std::unorederd_map中的元素的键是唯一的。

源代码如下:

class Solution {
public:
    vector<int> topKFrequent(vector<int>& nums, int k) {
        unordered_map<int, int> count;//计算频率
        for (auto &num: nums)
            count[num]++;
        multimap<int, int, std::greater<int>> freq;//用于排序,小根堆
        for (auto &f : count)
            freq.insert(make_pair(f.second, f.first));
        vector<int> res;//存放结果
        for (auto it = freq.begin(); it != freq.end() && k; ++it,--k)
            res.push_back(it->second);
        return res;
    }
};

相关文章

网友评论

      本文标题:LeetCode 347 前 K 个高频元素

      本文链接:https://www.haomeiwen.com/subject/voztbctx.html