标题:Java中优先队列,大根堆,小根堆
小根堆、大根堆,java中是使用优先队列实现的
升序:小根堆
降序:大根堆
PriorityQueue<Integer> q = new PriorityQueue<>(new Comparator<Integer>() {
@Override //升序,--小根堆,得到最大的前k个
public int compare(Integer i, Integer t1) {
return i- t1;//换成,t1 - i;就变成降序了
}
});
题目:得到最大的前k个元素
使用小根堆即可
1。先遍历前k个元素,放入堆中【堆顶元素最小,内部实现的】,
2。遍历第k+1个元素时,与堆顶元素比较,
若大于等于堆顶元素,则放入堆中;【如果 < 堆顶元素,则不理会】
调整堆,以此下去,所以最后小根堆中的元素是最大的前k个
//2.java中优先队列
public void TestPriorityQueue(){
PriorityQueue<Integer> q = new PriorityQueue<>(new Comparator<Integer>() {
@Override //升序,--小根堆,得到最大的前k个
public int compare(Integer i, Integer t1) {
return i- t1;//换成,t1 - i;就变成降序了
}
});
int[] nums = {15,24,3,246,25,3,85,61,24,9};
//保存三个元素
for(int in:nums){
q.offer(in);
if(q.size() > 3){
q.poll();
}
}
while(!q.isEmpty()){
Integer ret = q.poll();
System.out.println(ret);
}
}