Leetcode 215. Kth Largest Element in an Array 笔记

212 阅读1分钟

Medium

思路

  • sort array : nlogn
  • priority queue : nlogk
  • quick select : n
  • 选择pq

priority queue

  • PriorityQueue首先是一个队列
  • offer() 或则 add()
  • add(E e)和offer(E e)的语义相同,都是向优先队列中插入元素,只是Queue接口规定二者对插入失败时的处理不同,前者在插入失败时抛出异常,后则则会返回false。
  • peek()
  • 这个函数就比较简单了,返回优先级队列的最小的元素,由于PriorityQueue底层基于最小堆,最小堆又采用数组存储,所以堆顶元素即数组的第一个元素。
  • remove()和poll()
  • remove()和poll()方法的语义也完全相同,都是获取并删除队首元素,区别是当方法失败时前者抛出异常,后者返回null。

过程

  • for循环, offer元素进pq
  • 随时保持 pq 里元素数量保持k个
  • 最后把k个元素的 pq 的最顶的元素poll出来,返回
class Solution {
    public int findKthLargest(int[] nums, int k) {
        PriorityQueue<Integer> pq = new PriorityQueue<>();
        for(int i = 0; i < nums.length; i++){
            pq.add(nums[i]);
            if(pq.size() > k)
                pq.remove();
        }
        return pq.poll();
    }
}