Problem
Return the k-th smallest value of the list (k counts from 1). Quickselect finds it in average O(n) time without sorting everything.
Implement kth_smallest(numbers, k).
Input
numbers: The list of integers. k: Which smallest value to return, starting at 1.
Output
Return the k-th smallest value.
Einschränkungen
1 ≤ k ≤ length ≤ 200,000
Beispiele
Eingabe:
k = 3
numbers = [7, 10, 4, 3, 20, 15]
Erwartete Ausgabe:
expected = 7
Eingabe:
long long k = 3;
std::vector<long long> numbers = {7, 10, 4, 3, 20, 15};
Erwartete Ausgabe:
long long expected = 7;
Eingabe:
long k = 3;
long[] numbers = new long[] {7, 10, 4, 3, 20, 15};
Erwartete Ausgabe:
long expected = 7;
Erläuterung
Sorted: 3, 4, 7, 10, 15, 20; the 3rd smallest is 7.
Eingabe:
k = 2
numbers = [5, 5, 1]
Erwartete Ausgabe:
expected = 5
Eingabe:
long long k = 2;
std::vector<long long> numbers = {5, 5, 1};
Erwartete Ausgabe:
long long expected = 5;
Eingabe:
long k = 2;
long[] numbers = new long[] {5, 5, 1};
Erwartete Ausgabe:
long expected = 5;
Erläuterung
Sorted: 1, 5, 5; the 2nd smallest is 5 (duplicates count).
So gehst du vor
Versuch es zuerst allein und öffne dann einen Hinweis nach dem anderen.
Hinweis 1
Du brauchst nur das Element, das nach dem Sortieren an Position k stehen würde, nicht die vollständig sortierte Liste.
Hinweis 2
Partitioniere um einen Pivot und gehe nur rekursiv oder iterativ in die Seite, die den Zielrang noch enthalten kann.
Hinweis 3
Vergiss nicht, dass k einsbasiert ist, und Duplikate trotzdem als eigene Positionen zählen.
Erwartete Komplexität
O(n) average time, O(1) extra space
Referenzen
Diese Aufgabe wurde für CodeUtility angepasst. Beachte die oben genannten Vorgaben und Einschränkungen.