2016-04-22 2 views
0

Ich habe ein Array und mein Ziel ist herauszufinden, wie viele um ein Vielfaches von 11 sind. Das Array ist nicht sortiert.Wie überprüft man die maximale Anzahl von Elementen, die gleichmäßig verteilt sind?

Such as [27, 16, 52, 84], this would return 2 
     [1, 55, 66, 33] should return 3. 
     [99, 8, 52, 32] should return 0 

Zeit, was ich habe, ist im Grunde in dem Array für-jedes Element zu durchlaufen, überprüfen jedes andere Element mit mit 11 multipliziert Aber das lässt mich an einem O (n²) Laufzeit, trotzdem kann ich das optimieren ?

static int eval(int [] a) { 
     int i, j, k, counter = 0; 
     for (i = 0; i < a.length; i++) { 
      for (j = 0; j < a.length; j++) { 
       if (i != j) { 
        for (k = -9; k < 10; k++) { 
         if (a[i] == a[j] + k*11) { 
          counter++; 
          break; 
         } 
        } 
       } 
      } 
     } 
    //if found nothing, will return 0, if found 1 matching, 
    //it should be 2 numbers that share this 11-difference. 
    return counter : counter == 0? 0: counter + 1; 
} 

Vielen Dank!

+1

Yup. Sie müssen jedes Paar nacheinander überprüfen. Kann nicht weniger als 2 Loops gehen. –

+0

Aber immer noch - dein erstes Beispiel hat nur 16 und 27. Was ist das andere Paar? –

+1

yeah ich denke, ich sollte es als "wie viele Zahlen teilen Unterschied von 11". 16 und 27 sind 2 Zahlen, also 2 – bZhang

Antwort

1

Es ist nicht ganz klar, was die Ausgabe sein soll zum Beispiel, [11, 22, 34, 45]. Ich interpretiere die Frage so, dass ich nach der Größe der größten Teilmenge der Eingabe frage, wobei alle Unterschiede zwischen Elementen der Teilmenge ein Vielfaches von 11 sind und wobei Teilmengen der Größe 1 nicht zählen.

Alle Eingänge mit dem gleichen Restmodul 11 ​​sind um ein Vielfaches von 11 voneinander getrennt, so dass wir nur zählen müssen, wie viele Eingänge im Eingang einen möglichen Wert von i % 11 haben. Dies erfordert eine lineare Zeit in der Größe der Eingabe.

static int eval(int[] a) { 
    int[] inputsPerResidue = new int[11]; 
    for (int i : a) { 
     inputsPerResidue[i % 11]++; 
    } 
    int maxGroupSize = 0; 
    for (int groupSize : inputsPerResidue) { 
     if (groupSize > 1 && groupSize > maxGroupSize) { 
      maxGroupSize = groupSize; 
     } 
    } 
    return maxGroupSize; 
} 
+0

@MikelisBaltruks: Es ist nicht klar, was Sie damit meinen. Die gewünschte Ausgabe in der Problembeschreibung erwähnt nicht die Rückgabe der tatsächlichen Zahlen, die um ein Vielfaches von 11 beabstandet waren; es sagt nur, um eine Zählung zurückzugeben. – user2357112

+0

mein schlechtes. Lassen Sie diese Kommentare einfach löschen. : D –

+0

Das ist schlau, danke! – bZhang

1

Sie würden 2 Schleifen benötigen, um dies zu erreichen. Berechnen Sie den Unterschied zwischen jedem Element, und wenn diese Zahl ein Vielfaches von 11 ist, erhöhen Sie den Zähler. Rück Hälfte der Zähler, als ob Sie ein Vielfaches von 11 zwischen zwei Elementen treffen, werden Sie am Ende schlagen die beiden gleichen Elemente wieder später in der Schleife:

static int eval(int [] a) { 
    int counter = 0; 
    for (int i = 0; i < a.length; i++) { 
     for (int j = 0; j < a.length; j++) { 
      if (i != j && Math.abs(a[i] - a[j]) % 11 == 0) { 
       counter++; 
      } 
     } 
    } 
    return counter/2; 
} 
Verwandte Themen