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

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

优先队列的思路是很朴素的。由于找第 K 大元素,其实就是整个数组排序以后后半部分最小的那个元素。因此,我们可以维护一个有 K 个元素的最小堆:

如果当前堆不满,直接添加;
堆满的时候,如果新读到的数小于等于堆顶,肯定不是我们要找的元素,只有新遍历到的数大于堆顶的时候,才将堆顶拿出,然后放入新读到的数,进而让堆自己去调整内部结构。
说明:这里最合适的操作其实是 replace(),即直接把新读进来的元素放在堆顶,然后执行下沉(siftDown())操作。Java 当中的 PriorityQueue 没有提供这个操作,只好先 poll() 再 offer()。

优先队列的写法就很多了,这里只例举一个有代表性的,其它的写法大同小异,没有本质差别。

public int findKthLargest(int[] nums, int k) {

        //建立小根堆
        PriorityQueue<Integer> queue = new PriorityQueue<>(k, Integer::compare);

        //前K个数堆化
        for(int i = 0; i < k; i++) {
            queue.offer(nums[i]);
        }

        //向堆中插入剩下length - k个元素
        for(int i = k; i < nums.length; i++){
            //获取堆顶最小值
            int peek = queue.peek();
            //如果堆顶最小值大于当前的数,弹出并加入当前的数字, 那么此时的数字就是第length-k个最小的数, 反过来想就是第k个最大的数
            if(peek < nums[i]){
                queue.poll();
                queue.offer(nums[i]);
            }
        }

        //获取堆顶元素第K个最大的数字
        return queue.peek();
    }

作者:liweiwei1419
链接:https://leetcode.cn/problems/kth-largest-element-in-an-array/solution/partitionfen-er-zhi-zhi-you-xian-dui-lie-java-dai-/
来源:力扣(LeetCode)
著作权归作者所有。商业转载请联系作者获得授权,非商业转载请注明出处。

posted on 2022-10-25 16:33  老菜农  阅读(37)  评论(0编辑  收藏  举报

导航