【Lintcode】606. Kth Largest Element II

题目地址:

https://www.lintcode.com/problem/kth-largest-element-ii/description

给定一个数组,求其第 k k 大元素。其中数组长度 n k n\gg k 。由于有这个条件存在,我们可以用最小堆来做。开一个最小堆,先向里面offer进 k k 个数,接着维护这个最小堆始终保存已经读过的数中前 k k 大的数;如果新数大于堆顶,说明该数应该属于前 k k 大,而堆顶不属于,所以将堆顶poll出,把新数offer进堆。如此直到数组遍历完,堆顶即为所求。代码如下:

import java.util.PriorityQueue;

public class Solution {
    /**
     * @param nums: an integer unsorted array
     * @param k: an integer from 1 to n
     * @return: the kth largest element
     */
    public int kthLargestElement2(int[] nums, int k) {
        // write your code here
        PriorityQueue<Integer> minHeap = new PriorityQueue<>();
        for (int i = 0; i < nums.length; i++) {
            if (i < k) {
                minHeap.offer(nums[i]);
            } else {
                if (nums[i] > minHeap.peek()) {
                    minHeap.poll();
                    minHeap.offer(nums[i]);
                }
            }
        }
        
        return minHeap.peek();
    }
}

时间复杂度 O ( n log k ) O(n\log k) 。注意到,虽然Quick Select有更好的平均时间复杂度 O ( n ) O(n) ,但是上面用最小堆的方法有一个好处,就是可以在线处理,也即,它可以做到一边读,一边实时返回已经读过的数里的第 k k 大的数是谁。而Quick Select做不到这一点。

发布了354 篇原创文章 · 获赞 0 · 访问量 1万+

猜你喜欢

转载自blog.csdn.net/qq_46105170/article/details/105321665