たとえば、配列内の個別/一意の値の数をどのように返しますか
int[] a = {1,2,2,4,5,5};
Set<Integer> s = new HashSet<Integer>();
for (int i : a) s.add(i);
int distinctCount = s.size();
セットには、それぞれの一意の(.equals()で定義されている)要素が1回だけ格納されます。これを使用すると、問題を単純化できます。セットを作成し(私はHashSetを使用します)、配列を反復処理し、各整数をセットに追加してから、セットの.size()を返します。
効率的な方法:配列を。で並べ替えArrays.sort
ます。隣接する等しい値をカウントアップするための単純なループを記述します。
本当に配列内の要素の数に依存します。大量の整数を扱っていない場合は、HashSet またはバイナリ ツリーがおそらく最善の方法です。一方、多様な整数 (たとえば、10 億以上) の大きな配列がある場合は、各ビットが存在または非存在を表す 2^32 / 2^8 = 512 MByte バイト配列を割り当てることが理にかなっています。 -整数の存在を確認し、最後に設定されたビットの数を数えます。
バイナリ ツリー アプローチは n * log n 時間かかりますが、配列アプローチは n 時間かかります。また、バイナリ ツリーにはノードごとに 2 つのポインターが必要なため、メモリ使用量も大幅に増加します。同様の考慮事項がハッシュ テーブルにも適用されます。
もちろん、セットが小さい場合は、組み込みの HashSet を使用してください。