PriorityQueue
-
-
-
- 介绍
- 方法
- 构造对象(重点)
- 解决leetcode问题
- 注意事项
-
-
介绍
- 本篇文章介绍Java中的PriorityQueue类
- 首先说一下概念,PriorityQueue会维护一个堆(大顶堆、小顶堆),无论进行怎样的插入、删除操作,通过其内部的机制,将在这些动态的操作下保证其堆顶是最大值或最小值。
- 通过public class PriorityQueue extends AbstractQueue implements Serializable,我们知道:PriorityQueue类实现的接口和继承父类有【Serializable , Iterable , Collection , Queue】,因为AbstractQueue接口继承了【Iterable , Collection , Queue】
方法
- PriorityQueue类的方法与Queue的方法差不多,主要有以下方法:
- 清空队列
- void clear() 是否包含指定元素
- boolean contains(Object o) 将指定元素插入队列,注意PriorityQueue会进行排序,即插入元素后,队列仍就是有序的
- boolean offer(E e) 获得队首元素,但不删除
- E peek() 将队首元素从队列中删除,并返回旧元素
- E poll() 转换为数组
-
Object[] toArray()
…
构造对象(重点)
- PriorityQueue与Queue不同的是构造对象的时候,我们需要传入一个比较器对象,并实现比较器的接口方法compare。
PriorityQueue<Integer> queue=new PriorityQueue<Integer>(new Comparator<Integer>(){
public int compare(Integer e1,Integer e2){
return e2-e1;
}
});
解决leetcode问题
![](https://img.laitimes.com/img/__Qf2AjLwojIjJCLyojI0JCLiYTMfhHLlN3XnxCM38FdsYkRGZkRG9lcvx2bjxiNx8VZ6l2cscTLLZDbyAXNvF2b18WYvVjS5BXN4NkY181VaZDW2IWNX1SW1glMhVjTDpVNCF2S2EXLZVTQClGVF5UMR9Fd4VGdsATNfd3bkFGazxycykFaKdkYzZUbapXNXlleSdVY2pESa9VZwlHdssmch1mclRXY39CXldWYtlWPzNXZj9mcw1ycz9WL49zZuBnLmNjMkRWOlZWN4QzN0QDMihDZkRjNzYGO0YWNyU2N0czLc52YucWbp5GZzNmLn9Gbi1yZtl2Lc9CX6MHc0RHaiojIsJye.png)
class Solution {
public int findKthLargest(int[] nums, int k) {
//创建优先队列
PriorityQueue<Integer> queue = new PriorityQueue<Integer>(new Comparator<Integer>(){
//设置排序规则
public int compare(Integer m,Integer n){
return n-m;
}
});
//将数组中的元素一个一个插入至优先队列中,优先队列保证其有序性
for(int i : nums){
queue.offer(i);
}
//将优先队列前k个元素删除
for(int i=0;i<k-1;i++){
queue.poll();
}
//获取第k个元素,因为其经过排序,因此该元素在数组中也是第k大的
return queue.poll();
}
}
注意事项
- PriorityQueue与TreeSet有亿点点像,但Set集合是不允许存储重复元素的,而ProrityQueue是可以的。