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
table.Add(nums[i], 1);
}
foreach (DictionaryEntry item in table)
{
if (list.ContainsKey((int)item.Value))
list[(int)item.Value].Add((int)item.Key);
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)
{
res.Add(item);
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;
}