2016-12-30 4 views
0

Ich versuche, die Anzahl der Paare in einem Array so zu zählen, dass jedes Paar die Summe einer ganzen Zahl gibt!Die Anzahl der verschiedenen Paare von Ganzzahlen, die zu einer Ganzzahl summieren

habe ich den folgenden Code:

public static int SumPairs(Integer []input, int k){ 
    Map<Integer, Integer> pairs = new HashMap<Integer, Integer>(); 
    int tmp=0; 
    //System.out.println(pairs.toString()); 
    for(int i=0;i<input.length;i++){ 
    if(pairs.containsKey(input[i])){ 
      System.out.println(pairs.containsKey(input[i])); 
      System.out.println(input[i] +", "+ pairs.get(input[i])); 
      input[i]=0; 
      tmp++;  

     } 

     else 
      pairs.put(k-input[i], input[i]); 
    }return tmp; 
} 

das Problem ist; zum Beispiel, wenn mein Array 1 2 2 2 3 4 4 4 und sum = 5 es wie folgt

(4,1) 
(4,1) 
(4,1) 
(3,2) 

berechnen möchte ich die Methode von der Verwendung einer Anzahl mehr als einmal verhindern !! so dass der Ausgang

(4,1) 
(3,2) 
+0

Ist die Eingangsanordnung garantiert aufsteigend sortiert werden, wo der Unterschied zwischen einem Element und seinem Vorgänger ist nie größer als eins (Ihr Beispiel Array schlägt damit)? – Calculator

+0

Normalerweise nein, das Array könnte in irgendeiner Reihenfolge sein, sollte ich es zuerst sortieren? –

+0

Wenn die Eingabe unsortiert ist, sollte sie unsortiert bleiben. Es würde sonst die Laufzeitkomplexität erhöhen. Ich habe nur gefragt, weil es das Problem vereinfacht hätte. – Calculator

Antwort

1

Ich benutze einen Kartenwerte und ihre Frequenzen zu speichern:

public static int SumPairs(Integer[] input, int k){ 
    Map<Integer, Integer> frequencies = new HashMap<>(); 
    int pairsCount = 0;  

    for(int i=0; i<input.length; i++){ 
     int value = input[i]; 
     int complement = k - input[i]; 

     if(frequencies.containsKey(complement)){     
      int freq = frequencies.get(complement) - 1; 
      pairsCount++; 
      //System.out.println(value + ", " + complement);  
      if(freq == 0){ 
       frequencies.remove(complement); 
      }else{ 
       frequencies.put(complement, freq); 
      } 
     }else{ 
      if(frequencies.containsKey(value)){   
       frequencies.put(value, frequencies.get(value) + 1);    
      }else{ 
       frequencies.put(value, 1); 
      } 
     } 
    } 
    return pairsCount; 
} 
+0

Vielen Dank, aber leider ist es immer noch nicht funktionieren :( –

+0

Haben Sie an Fälle gedacht, dass {4,4,4,4,4,4,4 , 4,4,4,4,4,4,4} Summe = 8 –

+0

@raghadAlamri Was sollte die Antwort auf {4,4,4,4,4,4,4,4,4,4,4 sein, 4,4,4} Summe = 8? Ich dachte 1 -> Paar (4, 4). Meinst du, es sollte in diesem Fall 7 zurückgeben? – Calculator

0
public static int sumPairs(Integer[] input, int sum){ 
    List<Integer> complementaries = new ArrayList<>(input.length); 
    int pairs = 0; 
    for(Integer number : input){ 
     if(complementaries.contains(number)){ 
      complementaries.remove(number); 
      pairs++; 
     } 
     else{ 
      complementaries.add(sum-number); 
     } 
    } 
    return pairs; 
} 

Jetzt sollte es funktioniert perfekt sein wird.

Das Komplementär-Array wird nur dazu verwendet, die Anzahl der für die Summe benötigten Zahlen zu verfolgen. Wenn es die Zahl enthält, bedeutet dies, dass wir über seine Ergänzung vor iteriert haben, also können wir einfach ein Paar hinzufügen und die Zahl aus der Liste der Komplementärzeichen entfernen. Oherwise fügen wir der Liste die Komplementärzahl der aktuellen Zahl hinzu, ohne den Paarknoten zu erhöhen.

+0

Tut mir leid, es funktioniert nicht, ich bekomme immer noch falsche Antworten :( –

Verwandte Themen