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.
思路
这是一个O(n)时间复杂度的算法,优于O(nlogn)
1. 求出每个数字的频次字典
2. 按照频次,装入桶中
3. 取前K个频次
Code
C# version
public IList<int> TopKFrequent(int[] nums, int k)
{
Dictionary<int, int> frequencyMap = new Dictionary<int, int>();
foreach (var n in nums)
{
if (frequencyMap.ContainsKey(n))
frequencyMap[n]++;
else frequencyMap.Add(n, 1);
}
List<int>[] bucket = new List<int>[nums.Length + 1];
foreach (var item in frequencyMap)
{
int frequency = item.Value;
if (bucket[frequency] == null)
{
bucket[frequency] = new List<int>();
}
bucket[frequency].Add(item.Key);
}
List<int> res = new List<int>();
for (int pos = bucket.Length - 1; pos >= 0 && res.Count < k; pos--)
{
if (bucket[pos] != null)
{
res.AddRange(bucket[pos]);
}
}
return res;
}