Java 第k个最小使用堆的时间复杂度

Java 第k个最小使用堆的时间复杂度,java,heap,big-o,Java,Heap,Big O,下面是使用heap查找数组中第k个最小元素的代码。时间复杂度为O(n log(k)),其中k是堆的大小 根据我的理解,首先要遍历整个数组,即O(n)来填充堆。当到达数组的末尾时,堆的顶部会有第k个最小的元素,可以立即返回作为最终答案 但是,在下面的代码中,还有一个从k开始到数组长度的附加循环。我不太明白第二个循环的必要性 public int findKthSmallest(int[] arr, int k ) { if(k <= 0 || k > arr.length)

下面是使用heap查找数组中第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();
}
public int findkth最小值(int[]arr,int k){
if(k arr.length){
抛出新的IllegalArgumentException();
}
PriorityQueue smallestK=新的PriorityQueue(k,Collections.reverseOrder());
对于(int i=0;i
您读错了代码,应该是:

for(int i = 0; i < k; i++) {
    smallestK.add(arr[i]);
}
for(int i=0;i
在第一个循环中,我们需要在heap中插入第一个k元素

在当前时刻,smallestK.peek()将保存当前smallestK


在第二个循环中,我们处理数组中的剩余元素。我们将该值与当前的smallestK进行比较。

如果您读取了错误的代码,则应为:

for(int i = 0; i < k; i++) {
    smallestK.add(arr[i]);
}
for(int i=0;i
在第一个循环中,我们需要在heap中插入第一个k元素

在当前时刻,smallestK.peek()将保存当前smallestK


在第二个循环中,我们处理数组中的剩余元素。我们将该值与当前的smallestK进行比较。

此代码不执行您所说的。此代码不执行您所说的。