PriorityQueue优先级队列用法

用法

先说结论,JAVA中默认是小根堆,即小的在堆顶(poll时小的出去)

接下来看下默认的最小堆写法

PriorityQueue<Integer> queue = new PriorityQueue<Integer>(new Comparator<Integer>(){
 @Override
 public int compare(Integer o1, Integer o2){
 return o1 < o2 ? -1 : 1;
 // 最小优先队列,直接 return o1.compareTo(o2);
 }
});
// 最大优先队列,则反过来 return o2.compareTo(o1);

compare含义

compare(Integer o1, Integer o2)

一定要记住o1是待插元素,o2是最后一个非叶子节点,当compare()返回的值<0时入队,>0时不入队

  • 小根堆:o1若要入队,则o1<o2,同时compare需要返回负的,即o1.compareTo(o2)

  • 大根堆:o1若要入队,则o1>o2,同时compare需要返回负的,即o2.compareTo(o1)

具体场景

TopK问题:
一、找海量数据中最大的K个
构造小根堆,堆顶为最小数,不断入队,当队列数大于K时,将最小的堆顶弹出,最后剩下的就是K个最大数

二、数组中最小的K个
构造最大堆,堆顶为最大数,不断入队,当队列数小于K时,将最大的堆顶弹出,最后剩下的就是K个最小数

上一篇:JAVA内部类


下一篇:剑指 Offer 45. 把数组排成最小的数 - 模拟排序