题目: 已知int数组,输入k,输出出现次数最多的k个元素
思路: 1、HashTable使用同步机制,而HashMap是HashTable的轻量级实现(需要外同步),不允许重复键(即,重复键会覆盖);2、使用PriorityQueue,先进先出(排序)实现MinHeap,保存k个元素。
public List topKFrequent(int[] nums, int k) {
if(k <= 0) return null;
HashMap ht = new HashMap();
for(int key : nums){
Integer value = ht.get(new Integer(key));
if(value == null)
ht.put(new Integer(key), new Integer(1));
else
ht.put(new Integer(key), new Integer(value.intValue() + 1));
} //O(n) count #element
PriorityQueue pq = new PriorityQueue(); //achive MinHeap O(nlogn)
ArrayList list = new ArrayList<>();
for(Integer key : ht.keySet()){
pq.add(new Pair(key, ht.get(key)));
if(pq.size() > k){
pq.poll();
}
}
Pair pr;
while((pr = pq.poll()) != null){
list.add(0, pr.getKey());
}
return list;
}
class Pair implements Comparable{
Integer key;
Integer value;
public Pair(Integer key, Integer value) {
super();
this.key = key;
this.value = value;
}
public Integer getKey() {
return key;
}
public void setKey(Integer key) {
this.key = key;
}
public Integer getValue() {
return value;
}
public void setValue(Integer value) {
this.value = value;
}
//make out Pair nature order
public int compareTo(Pair o) {
// TODO Auto-generated method stub
if(value > o.value)
return 1;
else if(value < o.value)
return -1;
else
return 0;
}
}