1. 数据结构
1.1
2.Java使用
2.1 核心要点
- PriorityQueue是一个无限制的队列,并且动态增长。
- 默认情况下,优先级队列的对象按自然顺序排序。
- PriorityQueue 不是线程安全的。多线程情况下可以使用PriorityBlockingQueue。
2.2 构造函数
- PriorityQueue():使用默认初始容量(11)构造空队列,该容量根据其自然顺序对其元素进行排序。
- PriorityQueue(Collection c):构造包含指定集合中元素的空队列。
- PriorityQueue(int initialCapacity):构造具有指定初始容量的空队列,该容量根据其自然顺序对其元素进行排序。
- PriorityQueue(int initialCapacity,Comparator comparator):构造具有指定初始容量的空队列,该容量根据指定的比较器对其元素进行排序。
- PriorityQueue(PriorityQueue c):构造包含指定优先级队列中元素的空队列。
- PriorityQueue(SortedSet c):构造包含指定有序集合中元素的空队列。
2.3 方法
- boolean add(object):将指定的元素插入此优先级队列。
- boolean offer(object):将指定的元素插入此优先级队列。
- boolean remove(object):从此队列中删除指定元素的单个实例(如果存在)。
- Object poll():检索并删除此队列的头部,如果此队列为空,则返回null。
- Object element():检索但不删除此队列的头部,如果此队列为空,则返回null。
- Object peek():检索但不删除此队列的头部,如果此队列为空,则返回null。
- void clear():从此优先级队列中删除所有元素。
- boolean contains(Object o):如果此队列包含指定的元素,则返回true。
3.示例
3.1 题目
力扣第2558题,一道简单题,但是对上诉数据结构不熟悉就做不出。
3.2 思路
直接使用PriorityQueue即可。
3.3 代码实现
代码实现:
class Solution {
public long pickGifts(int[] gifts, int k) {
PriorityQueue<Integer> pq = new PriorityQueue<Integer>((a, b) -> b - a);
for (int gift : gifts) {
pq.offer(gift);
}
while (k > 0) {
k--;
int x = pq.poll();
pq.offer((int) Math.sqrt(x));
}
long res = 0;
while (!pq.isEmpty()) {
res += pq.poll();
}
return res;
}
}