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;
}
};
网友评论