【堆】【优先级队列】Leetcode 215. 数组中的第K个最大元素
- PriorityQueue操作
- 解法 优先级队列构造堆 小顶堆
---------------🎈🎈题目链接🎈🎈-------------------
PriorityQueue操作
- 创建优先级队列【默认创建小顶堆】:
PriorityQueue<Integer> priorityQueue = new PriorityQueue<>();
- 使用自定义比较器创建优先队列【创建大顶堆】:
PriorityQueue<Integer> customPriorityQueue = new PriorityQueue<>(Collections.reverseOrder());
- 插入元素: 如果队列已满,则抛出一个IIIegaISlabEepeplian异常
priorityQueue.add(5);
- 插入元素: 添加一个元素并返回true ,如果队列已满,则返回false
priorityQueue.offer(5);
- 获取队头元素:
Integer head = priorityQueue.peek();
- 弹出队头元素:
Integer removedElement = priorityQueue.poll();
- 删除指定元素
priorityQueue.remove(5);
- 获取队列大小:
int size = priorityQueue.size();
- 遍历队列元素:
for (Integer element : priorityQueue) { System.out.println(element); }
- 清空队列:
priorityQueue.clear();
解法 优先级队列构造堆 小顶堆
PriorityQueue<Integer> myqueue = new PriorityQueue<>((o1,o2) -> o1-o2);
队头到队尾升序排列的优先级队列 小顶堆
时间复杂度O(N)
空间复杂度O(N)
class Solution {public int findKthLargest(int[] nums, int k) {// 维护一个大小为k的优先级队列PriorityQueue 小顶堆升序PriorityQueue<Integer> myqueue = new PriorityQueue<>((o1,o2) -> o1-o2); // 升序 小顶堆for(int num:nums){if(myqueue.size() < k){myqueue.add(num);}else{if(myqueue.peek() < num){myqueue.poll();myqueue.add(num);} }}return myqueue.peek();}
}