# LeetCode-347.Top K Frequent Elements

https://leetcode.com/problems/top-k-frequent-elements/

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.

public IList<int> TopKFrequent(int[] nums, int k)
{
IList<int> res = new List<int>();
Hashtable table = new Hashtable();
SortedList<int, List<int>> list = new SortedList<int, List<int>>();
for (int i = 0; i < nums.Length; i++)
{
if (table.Contains(nums[i]))
table[nums[i]] = (int)table[nums[i]] + 1;
else
}
foreach (DictionaryEntry item in table)
{
if (list.ContainsKey((int)item.Value))
else
list.Add((int)item.Value, new List<int>() { (int)item.Key });
}
for (int i = list.Count - 1; i >= 0; i--)
{
foreach (int item in list.ElementAt(i).Value)
{
if (--k == 0)
return res;
}
}
return res;
}

C++实现，使用优先队列 参考https://leetcode.com/discuss/100562/o-log-k-unordered_map-and-priority_queue-maxheap-solution

#include <vector>
#include <map>
#include <queue>
using namespace std;
vector<int> topKFrequent(vector<int>& nums, int k)
{
map<int,int> mapping;
for (auto elem : nums)
mapping[elem]++;

vector<int> res;
priority_queue<pair<int,int>> prioQue;
for (auto it : mapping)
{
prioQue.push(make_pair(it.second, it.first));
if (prioQue.size() > mapping.size() - k)
{
res.push_back(prioQue.top().second);
prioQue.pop();
}
}
return res;
}

• 本文已收录于以下专栏：

举报原因： 您举报文章：LeetCode-347.Top K Frequent Elements 色情 政治 抄袭 广告 招聘 骂人 其他 (最多只允许输入30个字)