您的位置:首页 > 产品设计 > UI/UE

LeetCode347. Top K Frequent Elements【map+priority_queue解法】

2017-04-03 21:07 399 查看
Given a non-empty array of integers, return the k most frequent elements.

For example,

Given 
[1,1,1,2,2,3]
 and k = 2, return 
[1,2]
.

Note: 

You may assume k is always valid, 1 ≤ k ≤ number of unique elements.
Your algorithm's time complexity must be better than O(n log n), where n is the array's size.
class Solution {
public:
vector<int> topKFrequent(vector<int>& nums, int k) {
std::unordered_map<int, int> map;
for (auto val : nums) {
++map[val];
}
using mapiter = std::unordered_map<int, int>::iterator;
std::priority_queue<mapiter, std::vector<mapiter>, function<bool(const mapiter&,const mapiter&)>> queue(
[](const mapiter& p1, const mapiter& p2) { return p1->second > p2->second;});
for (auto it = map.begin(); it != map.end(); it++)
{
if (queue.size() < k) {
queue.push(it);
}
else if (it->second > queue.top()->second){
queue.pop();
queue.push(it);
}
}
std::vector<int> vi(k);
for (int i = k-1; i >= 0; i--)
{
auto it = queue.top();
vi[i] = it->first;
queue.pop();
}
return vi;
}
};
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签:  LeetCode