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.
采用HashSet和优先队列(PriorityQueue)可以解决,但是结果却并不是特别好
import java.util.ArrayList;
import java.util.Comparator;
import java.util.HashMap;
import java.util.List;
import java.util.Map;
import java.util.Map.Entry;
import java.util.PriorityQueue;
import java.util.Queue;
public class Solution {
public List<Integer> topKFrequent(int[] nums, int k) {
HashMap<Integer,Integer> map = new HashMap<Integer,Integer>();
List<Integer> list = new ArrayList<Integer>();
for(int i = 0 ; i < nums.length;i++)
{
if(map.containsKey(new Integer(nums[i])))
{
Integer num = new Integer(map.get(nums[i]));
map.put(nums[i], ++num);
}
else
map.put(nums[i], new Integer(1));
}
Comparator order = new Comparator(){
@Override
public int compare(Object o1, Object o2) {
Entry<Integer, Integer> entry1 = (Entry<Integer, Integer>) o1;
Entry<Integer, Integer> entry2 = (Entry<Integer, Integer>) o2;
if(entry1.getValue() > entry2.getValue())
{ return -1; }
else if(entry1.getValue()<entry2.getValue())
{ return 1; }
else
{ return 0; }
}
};
Queue priorityQueue = new PriorityQueue(11,order);
java.util.Iterator<Entry<Integer, Integer>> iter = map.entrySet().iterator();
while (iter.hasNext()) {
Entry<Integer, Integer> entry = iter.next();
priorityQueue.add(entry);
}
for(int i = 0 ; i < k ; i++)
{
Entry<Integer,Integer> entry = (Entry<Integer, Integer>) priorityQueue.poll();
list.add(entry.getKey());
}
return list;
}
}