2016-12-30 4 views
0

各ペアが整数の合計を与えるように、配列のペアの数を数えようとしています!整数の合計の異なるペアの数を見つける

私は、次のコードを使用:

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; 
} 

問題があるが、私の配列が1 2 2 2 3 4 4 4sum = 5 とき

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

次私は複数回番号を使用してからメソッドを禁止するよう例えばそれは計算! ので、出力は今、それが完璧に動作するはず

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

は、入力配列は要素間、それは前任者だ違いは、(あなたの例の配列が提案する1より大きくなることはありませんどこの昇順にソートされることが保証されてそう)? – Calculator

+0

通常、アレイはどのような順序でも構いません。最初に並べ替えるべきですか? –

+0

入力がソートされていない場合は、ソートされません。そうしないと、実行時の複雑さが増します。私はちょうど問題を簡略化したので、尋ねました。 – Calculator

答えて

1

私は値とその周波数を保存するマップを使用します。

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

ありがとう、残念ながらそれはまだ動作しません:( –

+0

あなたは{4,4,4,4,4,4,4 、4,4,4,4,4,4,4} sum = 8 –

+0

@raghadAlamri {4,4,4,4,4,4,4,4,4,4,4、 4,4,4} sum = 8?1 - >ペア(4、4)だと思いました。 – 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; 
} 

になります。

相補配列は、和を求めるために必要な数を記録するためだけに使用されます。数値が含まれている場合は、前に補完を繰り返したことを意味します。したがって、1つのペアを追加して、補数のリストから数を削除することができます。さらに、ペアカウンタをインクリメントすることなく、現在の番号の補数をリストに追加します。

+0

申し訳ありませんが、私はまだ間違った答えを得る:( –

関連する問題