java优先级队列(PriorityQueue)
什么是优先级队列?
其实就是⼀个披着队列外⾐的堆。因为优先级队列对外接⼝只是从队头取元素,从队尾添加元素,再⽆其他取元素的⽅式,看起来就是⼀个队列。与队列的区别在于优先级队列内部元素是⾃动依照元素的权值排列。
在Java中,优先队列是通过java.util.PriorityQueue
类实现的,不允许null元素。默认情况下,此队列是按照自然顺序排序的。java当中本身没有堆这个数据结构,如果想使用堆的话,可以通过优先队列来创建。
PriorityQueue的方法
- 三种常用的构造方法
import java.util.ArrayList;
import java.util.List;
import java.util.PriorityQueue;
public class TestPriorityQueue {
public static void main(String[] args) {
PriorityQueue<Integer> p1 = new PriorityQueue<>(); //容量默认为11
PriorityQueue<Integer> p2 = new PriorityQueue<>(10); //参数为初始容量
List<Integer> list = new ArrayList<>();
list.add(0);
list.add(1);
list.add(2);
PriorityQueue<Integer> p3 = new PriorityQueue<>(list); //使用集合list作为参数构造优先
// 级队列
}
}
- 构造大堆
PriorityQueue
默认是小堆,如果想要创建大堆可以重写compare
方法创建:
PriorityQueue<Integer> pq = new PriorityQueue<>(new Comparator<Integer>() {
@Override
public int compare(Integer o1, Integer o2) {
return o2-o1;
}
});
- 常用方法
Top-k问题
题目描述:
给定整数数组 nums 和整数 k,请返回数组中第 k 个最大的元素。
请注意,你需要找的是数组排序后的第 k 个最大的元素,而不是第 k 个不同的元素。
示例:
- 输入:[3,2,1,5,6,4], k = 2
- 输出:5
代码:
class Solution {
public int findKthLargest(int[] nums, int k) {
PriorityQueue<Integer> heap = new PriorityQueue<Integer>();
for(int i = 0;i<nums.length;i++){
if(heap.size()<k){
heap.offer(nums[i]);
}else{
if(nums[i]>heap.peek()){
heap.poll();
heap.offer(nums[i]);
}
}
}
return heap.peek();
}
}