gpt4 book ai didi

java - 使用Heap的第K个最小的时间复杂度

转载 作者:行者123 更新时间:2023-12-02 03:03:03 24 4
gpt4 key购买 nike

下面是使用堆查找数组中第 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进行比较。

关于java - 使用Heap的第K个最小的时间复杂度,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/42179835/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com