Gegeben eine Liste von zahlen und eine Zahl k, gibt an, ob zwei beliebige zahlen aus der Liste hinzufügen von bis zu k
Diese Frage wurde in der Google-Programmierung interview. Ich dachte an zwei Ansätze für das gleiche:
-
Finden Sie alle untersequenzen der Länge. Dabei berechnen der Summe und der beiden Elemente und überprüfen, ob es ist gleich k. Wenn Ihr, drucken Sie, ja, sonst halten die Suche. Dies ist eine brute-Force-Ansatz.
-
Sortieren Sie das array in nicht-absteigender Reihenfolge. Starten Sie dann das Durchlaufen des Arrays von dessen rechten Ende. Sagen wir, wir haben das sortierte array, {3,5,7,10} und wir wollen die Summe von 17. Wir beginnen element 10, index=3, wir bezeichnen den index mit 'j'. Dann das aktuelle element und berechnen required_sum= Summe - current_element. Danach führen wir eine binäre oder ternäre Suche im array[0- (j-1)] zu finden, wenn es ein element, dessen Wert gleich dem required_sum. Wenn wir finden, ein solches element, können wir durchbrechen, wie wir gefunden haben, eine Teilfolge der Länge 2, deren Summe die gegebene Summe. Wenn wir nicht finden, eine solches element, und verringern Sie dann den index j und wiederholen Sie die oben genannten Schritte für die daraus entstehenden subarray Länge= Länge-1, d.h. durch ohne das element mit dem index 3 in diesem Fall.
Hier haben wir berücksichtigt, dass array könnte negative als auch als positive ganze zahlen.
Können Sie vorschlagen, eine bessere Lösung als diese? Ein DP-Lösung vielleicht? Eine Lösung, die weiter zu reduzieren, ist es Zeit, Komplexität.
- Es ist ein
O(n)
Raum und Zeit-Algorithmus für diese. Für jedes element prüfen, ob es existiert in der hashmap. Wenn nicht,' storek - arr[i]
bewegen und auf das nächste element. - Wörterbuch und die Bedeutung der Summe machen trick dieser Frage.
- Kann zahlen im array duplizieren?
Du musst angemeldet sein, um einen Kommentar abzugeben.
Diese Frage kann leicht gelöst werden mit Hilfe von set in O(N) Zeit und Raum Komplexität.Fügen Sie zunächst alle Elemente von array zu legen und dann Durchlaufen Sie jedes element von array und prüfen, ob K-ar[i] vorhanden ist oder nicht festgelegt.
Hier ist der code, der in java mit O(N) Komplexität :
Hier ist eine Java-Implementierung mit der gleichen Zeitkomplexität wie der Algorithmus sortiert das array. Beachten Sie, dass diese schneller als die zweite Idee, da brauchen wir nicht zu suchen, das gesamte array nach einem passenden partner jedes mal, wenn wir untersuchen eine Reihe.
Beweis durch Induktion:
Lassen Sie eine[0,n] ein array mit der Länge n+1 und p = (p1, p2) wobei p1, p2 sind ganze zahlen und p1 <= p2 (w.l.o.g.). Angenommen a[0,n] enthält, p1 und p2. In dem Fall, dass es nicht, der Algorithmus ist offensichtlich richtig.
Basiswert (i = 0, j = n):
a[0,-1] nicht enthalten p1 und a[n,n+1] nicht enthalten p2.
Hypothese:
a[0,i-1] nicht enthalten[i] und a[j+1,n] nicht enthalten p2.
Schritt Fall (i bis i + 1 oder j aus j - 1):
Da bei jeder iteration a[0,i-1] und a[j+1,n] nicht enthalten p1 und p2, a[i,j] enthält p1 und p2. Schließlich a[i] = p1 und a[j] = p2 und der Algorithmus den Wert true zurück.
Dies ist die java-Implementierung mit O(n) Zeitkomplexität und O(n) Speicherplatz. Die Idee ist eine HashMap enthalten wird ergänzt jedes array-element w.r.t target. Wenn die Ergänzung ist gefunden, wir haben 2 array-Elementen die Summe zum Ziel.
wenn Sie möchten zu finden-pair-Mädchen zählen,
def pair_count(_list, k): return sum([k - j in _list for i in _list]) // 2
arbeitet seitTrue == 1
, undsum()
zählt, wie viele Elemente in den generator sind wahr. Natürlich, dieses fließt wieder in die ursprüngliche Frage - ersetzen Sie die return-Anweisung mitreturn any(k - j in _list for i in _list)
, die tatsächlich viel effizienter, daany
gibt True zurück, auf das erste vorkommen von True, was bedeutet, dass Sie nicht zwangsläufig gehen durch jedes element vonlist_
in einigen Fällen.Python-Lösung:
Oder
Mit Scala, in einem einzigen Durchgang, mit O(n) Zeit und Raum Komplexität.
Hier ist eine Umsetzung in C
Für das Sortieren O(n2) Zeit und Raum Komplexität.
Für die Lösung des Problems, das Wir verwenden
single-pass-mit O(n) Zeit und Raum Komplexität über Rekursion.
/* Eine Liste von zahlen und eine Zahl k , Rückkehr Wetter zwei beliebige zahlen aus der Liste hinzufügen von bis zu k.
Zum Beispiel, angegeben [10,15,3,7] und k 17 , return 10 + 7 ist 17
Bonus: Können Sie in einem Durchgang ? */
AUSGABE
Hier ist die python-Implementierung
Die Lösung kann gefunden werden in nur einem Durchlauf das array. Initialisieren Sie einen hash-Set und starten Sie Durchlaufen das array. Wenn das aktuelle element im array gefunden wird, in der festgelegt wird true zurückgegeben, sonst fügen Sie das Komplement des Elements (x - arr[i]) der Satz. Wenn die iteration des Arrays beendet, ohne dass es bedeutet, dass es kein solches paar, deren Summe gleich x, also false zurück.
C++ - Lösung:
Javascript.
Python
Hier ist Python. O(n). Müssen zum entfernen des aktuellen Elements, während looping, da die Liste möglicherweise nicht doppelte zahlen.
Ich kam mit zwei Lösungen in C++. War ein naiver brute-force-Typ, das in O(n^2) Zeit.
Dieser Lösung könnte man sich vorstellen, nehmen eine große Menge an Zeit auf höhere Werte von input.
Meine zweite Lösung, die ich war in der Lage zu implementieren, die in O(N) Zeit. Mit einem unordered_set, ähnlich wie die oben genannte Lösung.
Javascript-Lösung:
Hier zwei sehr schnelle Python-Implementierungen (welche für den Fall, dass die Eingänge der
[1,2]
und2
sollte return false; in anderen Worten, man kann nicht einfach die doppelte Zahl, denn es gibt "zwei").Diese erste Schleife durch die Liste der Bedingungen und fügt jedem Begriff, zu jeder zuvor gesehen Bedingungen, bis es auf die gewünschte Summe.
Diese eine zieht jeden Begriff aus dem Ergebnis-bis auf einen Unterschied, der ist in der Liste der Begriffe (mit der Regel, dass
a+b=c -> c-a=b
). Die Verwendung vonenumerate
und die ungeraden Liste der Indexierung ausschließen, den aktuellen Wert, gemäß dem ersten Satz dieser Antwort.Wenn Sie gestatten das hinzufügen einer Zahl zu sich selbst, dann die zweite Implementierung deutlich vereinfacht werden kann:
Python-code:
C# - Lösung:
Mein C# - Implementierung:
Python-Implementierung:
Der code würde ausgeführt in O(n) Komplexität, die mit der Nutzung von Wörterbuch. Wir würden Speicherung der (desired_output - current_input) als der Schlüssel im dictionary. Und dann würden wir prüfen, ob die Zahl im Wörterbuch vorhanden ist oder nicht. Suche in einem Wörterbuch hat eine Durchschnittliche Komplexität O(1).
PairToSumK([1,2],2)
False sein sollte, aber es ist Wahr.Javascript
Hier eine javascript-Lösung:
Ich umgesetzt mit Scala
Ich habe versucht die Lösung in der Go Lang. Allerdings, benötigt er O(n^2) Zeit.
Lösung in javascript
diese Funktion nimmt 2 Parameter und eine Schleife durch die Länge der Liste und innerhalb der Schleife gibt es eine weitere Schleife, die fügt eine Zahl zu anderen zahlen in der Liste und überprüfen Sie es die Summe wenn Ihr gleich k ist oder nicht
Meine Antwort auf die Täglichen Coding-Problem
Hier ist der code in Python 3.7 mit O(N) Komplexität :
und auch im besten Fall-code in Python 3.7 mit O(N^2) Komplexität :
Javascript-Lösung
Mit vavr Bibliothek es getan werden kann, in ziemlich prägnanter Weise: