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 maximal a und b.
  • 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. Hier 3.
  • 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).

Möchten Sie, dass der maximale absolute Wert? I. e., 35 eine "höhere" Produkt als -49?
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

Schreibe einen Kommentar