215. 数组中的第K个最大元素

33 阅读1分钟

215. 数组中的第K个最大元素

给定整数数组 nums 和整数 k,请返回数组中第 k 个最大的元素。

请注意,你需要找的是数组排序后的第 k 个最大的元素,而不是第 k 个不同的元素。

你必须设计并实现时间复杂度为 O(n) 的算法解决此问题。

示例 1:

输入: [3,2,1,5,6,4], k = 2
输出: 5

示例 2:

输入: [3,2,3,1,2,4,5,5,6], k = 4
输出: 4
class Solution {
    /**
    两种方式:
    1.快速排序+类似二分搜索:因为不需要保证数组全有序,只需要找到目标K大元素,所以可以通过partion位置和K的比较结合。例如:(1)partion=k,则找到目标
         (2)partion<k,说明目标在右边,从右边找并随机一个partion应用递归
         其他同理。
    2.小顶堆:维护K个最大元素的小顶堆,堆顶就是目标K(采用该方法实现)
     */
    public int findKthLargest(int[] nums, int k) {
        PriorityQueue<Integer> heap = new PriorityQueue<>(k,(c1,c2) -> c1-c2);
        //先添加k个元素
        for(int i=0;i<k;i++){
            heap.offer(nums[i]);
        }
        //后续元素:
        //1.如果当前元素大于堆顶元素,则删除堆顶并入堆;
        //2.如果小于,则抛弃。
        for(int i=k;i<nums.length;i++){
            int top = heap.peek();
            int curVal = nums[i];
            if(curVal>top){
                heap.poll();
                heap.offer(curVal);
            }
        }
        return heap.peek();
    }
}