题目地址:
https://www.lintcode.com/problem/kth-largest-element-ii/description
给定一个数组,求其第 大元素。其中数组长度 。由于有这个条件存在,我们可以用最小堆来做。开一个最小堆,先向里面offer进 个数,接着维护这个最小堆始终保存已经读过的数中前 大的数;如果新数大于堆顶,说明该数应该属于前 大,而堆顶不属于,所以将堆顶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();
}
}
时间复杂度 。注意到,虽然Quick Select有更好的平均时间复杂度 ,但是上面用最小堆的方法有一个好处,就是可以在线处理,也即,它可以做到一边读,一边实时返回已经读过的数里的第 大的数是谁。而Quick Select做不到这一点。