前k个高频元素-堆

49 阅读1分钟
// 前k个高频元素-堆  
// 输入: nums = [1,1,1,2,2,3], k = 2  
// 输出: [1,2]  
public static int[] topKFrequent(int[] nums,int k){  
    HashMap<Integer, Integer> map = new HashMap<Integer, Integer>();  
    for (int num:  
    nums) {  
        map.put(num,map.getOrDefault(num,0)+1);  
    }  
    PriorityQueue<int[]> q = new PriorityQueue<>(new Comparator<int[]>() {  
    @Override  
    public int compare(int[] o1, int[] o2) {  
        return o1[1] - o2[1];  
    }  
    });  
    for (Map.Entry<Integer,Integer> entry:  
    map.entrySet()  
    ) {  
        int num=entry.getKey(),  
        count=entry.getValue();  
        if(q.size()==k){  
            if(q.peek()[1]<count){  
                q.poll();  
                q.offer(new int[]{num,count});  
            }  
        }else{  
            q.offer(new int[]{num,count});  
        }  
    }  
    int[] ret=new int[k];  
    for (int i = 0; i <k ; i++) {  
        ret[i]=q.poll()[0];  
    }  
    return ret;  
}