0
以下は、ヒープを使用して配列のk番目に小さい要素を見つけるためのコードです。時間の複雑さはO(n log(k))です。ここで、kはヒープのサイズです。ヒープを使用したKth最小の時間複雑度
私が理解しているように、まず配列全体、つまりO(n)を調べてヒープを作成します。配列の最後に到達すると、ヒープの最上部にk番目の最小要素があり、最終的な答えとして即座に返すことができます。
ただし、以下のコードでは、kから配列の長さまでの追加ループがあります。私はこの2番目のループの必要性を本当に理解していません。
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();
}
このコードはあなたの言うことをしません。 – abl