链接:https://leetcode-cn.com/problems/top-k-frequent-elements/
class Solution {
private class Freq implements Comparable<Freq>{
int num,freq;
public Freq(int num,int freq){
this.num=num;
this.freq=freq;
}
@Override
public int compareTo(Freq another) {
if(this.freq>another.freq){
return 1;
}else if(this.freq<another.freq){
return -1;
}else{
return 0;
}
}
}
public List<Integer> topKFrequent(int[] nums, int k) {
TreeMap<Integer,Integer> map=new TreeMap<>();
for(int num:nums){
if(!map.containsKey(num)){
map.put(num, 1);
}else{
map.put(num, map.get(num)+1);
}
}
//最小堆
PriorityQueue<Freq> queue=new PriorityQueue<Freq>();
for(int num:map.keySet()){//O(n)
if(queue.size()<k){
queue.add(new Freq(num, map.get(num)));//O(logm)
}else if(map.get(num)>queue.peek().freq){
queue.remove(); //O(logm)
queue.add(new Freq(num,map.get(num)));//O(logm)
}
}
LinkedList<Integer> list=new LinkedList<>();
while(!queue.isEmpty()){
list.add(queue.remove().num);
}
return list;
}
}