美文网首页
LeetCode 347

LeetCode 347

作者: 萨缪 | 来源:发表于2020-04-27 22:36 被阅读0次
  1. 前 K 个高频元素

在未排序的数组中找到第 k 个最大的元素。请注意,你需要找的是数组排序后的第 k 个最大的元素,而不是第 k 个不同的元素。

示例 1:

输入: [3,2,1,5,6,4] 和 k = 2
输出: 5

示例 2:

输入: [3,2,3,1,2,4,5,5,6] 和 k = 4
输出: 4

说明:

你可以假设 k 总是有效的,且 1 ≤ k ≤ 数组的长度。

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

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

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