【堆】【优先级队列】Leetcode 215. 数组中的第K个最大元素
作者:mmseoamin日期:2024-03-04

【堆】【优先级队列】Leetcode 215. 数组中的第K个最大元素

    • PriorityQueue操作
    • 解法 优先级队列构造堆 小顶堆

      ---------------🎈🎈题目链接🎈🎈-------------------

      【堆】【优先级队列】Leetcode 215. 数组中的第K个最大元素,在这里插入图片描述,第1张

      PriorityQueue操作

      1. 创建优先级队列【默认创建小顶堆】:

        PriorityQueue priorityQueue = new PriorityQueue<>();

      2. 使用自定义比较器创建优先队列【创建大顶堆】:

        PriorityQueue customPriorityQueue = new PriorityQueue<>(Collections.reverseOrder());

      3. 插入元素: 如果队列已满,则抛出一个IIIegaISlabEepeplian异常

        priorityQueue.add(5);

      4. 插入元素: 添加一个元素并返回true ,如果队列已满,则返回false

        priorityQueue.offer(5);

      5. 获取队头元素:

        Integer head = priorityQueue.peek();

      6. 弹出队头元素:

        Integer removedElement = priorityQueue.poll();

      7. 删除指定元素

        priorityQueue.remove(5);

      8. 获取队列大小:

        int size = priorityQueue.size();

      9. 遍历队列元素:

        for (Integer element : priorityQueue) { System.out.println(element); }

      10. 清空队列:

        priorityQueue.clear();

      解法 优先级队列构造堆 小顶堆

      PriorityQueue myqueue = new PriorityQueue<>((o1,o2) -> o1-o2); 队头到队尾升序排列的优先级队列 小顶堆

      时间复杂度O(N)

      空间复杂度O(N)

      class Solution {
          public int findKthLargest(int[] nums, int k) {
              // 维护一个大小为k的优先级队列PriorityQueue 小顶堆升序
              PriorityQueue 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();
          }
      }