1 回答
TA贡献1801条经验 获得超16个赞
这个问题的最佳情况是 O(nlogk),我们可以使用最大或最小堆数据结构来解决这个问题。如果 k 很小,这将接近 O(n)。这个想法是我们不必对整个数组进行排序,而是取一个大小为 k 的堆,并始终对堆中存在的 k 个元素进行排序。
O(n) 遍历数组
O(logk) 用于使用堆排序对 k 个元素进行排序。
public Integer getKthEle(Integer[] numbers, int k) {
PriorityQueue<Integer> maxHeap = new PriorityQueue(k, new Comparator<Integer>() {
public int compare(Integer a, Integer b) {
return b-a;
}
}
);
for(int i=0;i<k;i++) {
maxHeap.offer(numbers[i]);
}
// maintain the size k by adding to the queue if the next element is smaller than the head of the queue; remove from the head of the queue which is the largest element in the queue
for(int i=k;i<numbers.length;i++) {
if(numbers[i] < maxHeap.peek()) {
maxHeap.offer(numbers[i]);
maxHeap.poll();
}
}
return maxHeap.peek();
}
添加回答
举报