以下是使用堆在数组中查找第k个最小元素的代码。时间复杂度为O(n log(k)),其中k是堆的大小。
根据我的理解,您首先要遍历整个数组,即O(n)来填充您的堆。而且,当您到达数组的末尾时,堆顶部将有第k个最小的元素,您可以立即将其返回作为最终答案。
但是,在下面的代码中,还有一个附加循环,从k开始到数组的长度。我不太了解第二个循环的必要性。
public int findKthSmallest(int[] arr, int k ) {
if(k <= 0 || k > arr.length) {
throw new IllegalArgumentException();
}
PriorityQueue<Integer> smallestK = new PriorityQueue<>(k, Collections.reverseOrder());
for(int i = 0; i < arr.length; i++) {
smallestK.add(arr[i]);
}
for(int j = k; j < arr.length; j++) {
if(arr[j] < smallestK.peek()) {
smallestK.remove();
smallestK.add(arr[j]);
}
}
return smallestK.peek();
}
最佳答案
您读错了代码,应该是:
for(int i = 0; i < k; i++) {
smallestK.add(arr[i]);
}
在第一个循环中,我们需要在堆中插入第一个k元素。
当前,smallestK.peek()将保存当前的smallestK。
在第二个循环中,我们处理数组中的其余元素。我们将该值与当前的最小值K进行比较。