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