Finden Sie maximale Produkt der 3 zahlen in einem array
Gegeben ein array von ganzen zahlen, die enthalten beide +ve-und -ve-zahlen. Ich habe zu maximieren, das Produkt 3 Elemente des Arrays. Die Elemente können nicht zusammenhängend.
Einige Beispiele:
int[] arr = { -5, -7, 4, 2, 1, 9}; //Max Product of 3 numbers = -5 * -7 * 9
int[] arr2 = {4, 5, -19, 3}; //Max Product of 3 numbers = 4 * 5 * 3
Ich habe versucht es zu lösen mit Dynamische Programmierung, aber ich bin nicht immer das erwartete Ergebnis. Es ist wieder das Ergebnis oft mit der gleichen Nummer zweimal in die Multiplikation. Also, für die array - {4, 2, 1, 9}
ist es die Rückkehr - 32
, die 4 * 4 * 2
.
Hier ist mein code:
public static int maxProduct(int[] arr, int count) {
return maxProduct(arr, 0, arr.length - 1, count);
}
private static int maxProduct(int[] arr, int fromIndex, int toIndex, int count) {
if (count == 1) {
return maximum(arr, fromIndex, toIndex);
} else if (toIndex - fromIndex + 1 < count) {
return 1;
} else {
return MathUtil.max(maxProduct(arr, fromIndex, toIndex - 1, count - 1) * arr[toIndex - 1],
maxProduct(arr, fromIndex, toIndex - 1, count));
}
}
MathUtil.max(int a, int b)
ist eine Methode, die gibt maximala
undb
.- Die beiden Werte, die ich übergeben, um
max
Methode gibt es:maxProduct
, wenn wir Bedenken, das Letzte element als ein Teil des Produktes.maxProduct
, wenn wir nicht betrachten es als ein Teil des Produktes.
count
enthält die Anzahl der Elemente, die wir betrachten wollen. Hier3
.- Für
count == 1
suchen wir noch maximal 1 element aus dem array. Das bedeutet, wir verwenden die maximale array-element. - Wenn
toIndex - fromIndex + 1 < count
, bedeutet, es gibt nicht genug Elemente im array zwischen diesen Indizes.
Ich habe eine intuition, dass der erste if
Zustand ist einer der Gründe des Scheiterns. Weil, es ist nur wenn man maximale element aus einem array, während das maximale Produkt kann aus negativen zahlen zu. Aber ich weiß nicht, wie zu kümmern.
Der Grund, warum ich mit Hilfe der Dynamischen Programmierung ist, dass ich dann verallgemeinern Sie diese Lösung, um für jeden Wert von count
. Natürlich, wenn jemand irgendeine bessere Annäherung, auch für count = 3
begrüße ich den Vorschlag (ich möchte vermeiden, Sortieren Sie das array, so dass ein weiteres O(nlogn)
zumindest).
Ja. Maximale Produkt, nicht maximale absolute Produkt.
Ihr Algorithmus mit
recursion
können Sie hinzufügen if
Zustand zu überprüfen fromIndex
und toIndex
mit entsprechenden return
, kann wieder 1
, Sie könnten Ihre Arbeit getan.Ich verstehe es nicht. Ich habe bereits einen base-case-Betrachtung die Werte der
fromIndex
und toIndex
. Tun Sie wollen mich zu der überlegung, einen anderen Fall?Ja, ich denke, das ist, was Sie brauchen. Wenn Ihre Multiplikation geschieht mit der gleichen
array element
, dann seine bug
im code, und Sie sollten aufpassen, dass case
wo fromIndex
und toIndex
sind die gleichen.InformationsquelleAutor user3011937 | 2013-12-12
Du musst angemeldet sein, um einen Kommentar abzugeben.
Sortieren Sie das gegebene array in aufsteigender Reihenfolge, und nehmen Sie die maximale in diesen Fällen
um die Antwort zu erhalten..
was ist mit negativen Werten
zahlen würde abgedeckt werden, der zweite Punkt ...
habe es Dank, btw, das ist meine Lösung in Javascript github.com/doron2402/algorithm-interviews/blob/master/...
was ist, wenn alle Elemente negativ sind? Ich denke, das wird nicht funktionieren. Sollten wir auch überprüfen Sie die ersten 3 Elemente " - Produkt?
InformationsquelleAutor Srinath
Für count=3, Ihre Lösung wird 1 der 3 Formen:
Die 3 größte positive Werte (vorausgesetzt, es gibt 3 positive Werte)
Den größten positiven Wert und die 2 kleinsten negativen Werte (vorausgesetzt, es gibt einen positiven Wert)
Den 3 am wenigsten negativen Werte
Jeder von denen kann gelöst werden viel einfacher als mit DP.
Vorausgesetzt, Sie sind unter der Annahme absoluter Werte, gemessen an #3, wird es einen vierten Fall, der die 2 größten zahlen und die geringsten negativen Zahl, in diesem Fall bricht alles zusammen an einem Fall, das ist die 3 zahlen, die am weitesten von 0.
Frey: ich war nicht der Annahme absoluter Werte; für #3, ich meinte die negative w/ den KLEINSTEN absoluten Wert (wenn alle Werte negativ sind, wird Ihr Ergebnis wird negativ sein, so dass Sie Schießen, die negativen, die 0 am nächsten ist).
Ah, ich sehe.
So haben wir zum iterieren über das array für alle 3 Fälle, und dann herauszufinden, die 3 Werte für alle? Keine einfache Möglichkeit?
InformationsquelleAutor Scott Hunter
Ist es immer max(kleinste zwei negative Ziffern und größte positive oder
letzten drei die große positive zahlen)
InformationsquelleAutor Sumedha Khatter
InformationsquelleAutor openmike
}
InformationsquelleAutor Midhula Kadiyala
obwohl diese Lösung ist einfach dies beinhaltet im wesentlichen die Sortierung des Arrays und dann mit dem Produkt der letzten drei zahlen , bevor Sie zu tun ist ; alle Werte in das array sollte positiv sein .das geschieht durch die erste for-Schleife.
InformationsquelleAutor ravi tanwar
https://github.com/amilner42/interviewPractice/blob/master/src/interviewProblems/Problem5.java
InformationsquelleAutor Arie Milner
Dieses problem getan werden kann, in
O(n)
Zeit.Verfolgen diese 5 Variablen und aktualisieren Sie Sie während jeder iteration:
Nach der letzten iteration, ein Produkt von 3 zahlen-variable wird die Antwort sein.
2 positive values and 1 negative value
geändert?InformationsquelleAutor user4259055
Unter der Annahme, dass eine positive Produkt ist größer als das negative Produkt, das ich denken kann auf folgende Weise getan werden kann.
Wenn es weniger als zwei negativen Elementen in dem array, dann ist es einfacher, ein Produkt von top 3(top == positiven) Elemente.
Wenn negative zahlen sind so gewählt, mindestens 2 von Ihnen müssen in das Produkt, so ist das Produkt positiv. Also was auch immer der Fall sein, den oberen (positiven) Zahl wird immer Teil des Produktes.
Multiplizieren beiden letzten(negativen) und der 2. und 3. höchsten(positiven) und vergleichen. Von diesen zwei Paaren je höher der Wert, wird ein Teil des fertigen Produkts zusammen mit den oben positiver auf die shortlist in der Zeile darüber.
InformationsquelleAutor tick_tack_techie
https://stackoverflow.com/users/2466168/maandoo 's Antwort ist die beste.
Als er sagte, die Antwort ist
max(l,r)
fürLassen Sie mich aufwendige jetzt.
Ich denke, das problem ist Verwirrung, weil jede Zahl kann positiv, negativ und null. 3 Staat ist lästig zu verwalten, die durch Programmierung, wissen Sie!
Fall 1) Gegebenen drei zahlen
Fall 2) Gegebenen vier zahlen
+
Negative Zahl ist, zeigen-
.Fall 2-1)
Wenn a 0 ist, gemischt in vier zahlen, kommt es zwischen
-
und+
.Fall 2-2)
Angenommen, kleinste
+
war eigentlich 0.Fall 2-3)
Angenommen, größte
-
war eigentlich 0.Fall 2-4)
Wenn mehr als zwei 0 ist gemischt, Produkte wird immer 0, da
Zusammenfassung Fall 2)
Antwort ist übereinstimmend Fall 2-1 ~ 2-4.
So, wir brauchen uns nicht sorgen zu machen über die 0 eigentlich.
Fall 3) Mehr als vier zahlen
InformationsquelleAutor purucat
InformationsquelleAutor Gautam Malhotra
InformationsquelleAutor Let's Learn Together
Sortieren Sie Das Array
Dann max werden entweder das Produkt der letzten 3 oder ersten 2(bei negativen zahlen) und die letzten.
InformationsquelleAutor Sailee Renapurkar
in JavaScript
InformationsquelleAutor Shanu T Thankachan
Sprache - C#
Greedy-Ansatz
Dank interviewcake.com
Ausführliche Erklärung des Algorithmus
InformationsquelleAutor Code-EZ
Können Sie mithilfe der eingebauten sort-Funktion von Javascript.Müssen vorsichtig sein, während der Suche nach max triplet Produkt, wie im Falle von array -ve-Nummern Produkt-Kombination die ersten 2 und die Letzte und bei allen +ve die letzten 3 Nummer Produkt führen.Sie können sich meine jsfiddle. Auch die Komplexität dieses Algorithmus ist O(nlogn)
InformationsquelleAutor Avinash