トピック:
配列内の繰り返し番号を見つけます。
長さnの配列nums内のすべての数値は、0〜n-1の範囲です。配列内のいくつかの数字が繰り返されますが、何回繰り返されるか、また各数字が何回繰り返されるかはわかりません。配列内で重複する番号を見つけてください。
例:入力: [ 2、3、1、0、2、5、3 ]出力: 2または3
class Solution {
public int findRepeatNumber(int[] nums) {
HashSet<Integer> l =new HashSet<>();
for(int i:nums){
if(!l.contains(i))
l.add(i);
else
return i;}
return 0;
}
}
分析:ArrayListはシーケンシャル構造であり、データの繰り返しが可能であるため、ArrayListの使用はタイムアウトになりますが、HashSetは順序付けられていない構造であり、重複データは許可されません。詳細は以下のとおりです。
配列リスト:
データの要素が繰り返されるのでcontains()
、この方法は、使用される。しかし、この方法は、その呼び出す方法。インサイド方法は、forループがあるため、時間複雑方法がありますArrayList
contains()
indexOf()
indexOf()
ArrayList
contains()
O(n)。
public boolean contains(Object o) {
return indexOf(o) >= 0;
}
public int indexOf(Object o) {
if (o == null) {
for (int i = 0; i < size; i++)
if (elementData[i]==null)
return i;
} else {
for (int i = 0; i < size; i++)
if (o.equals(elementData[i]))
return i;
}
return -1;
}
HashSet:
HashSet
そのadd()
メソッドは自動的に強調を解除するため、これはメソッドの呼び出しmap
でありput
、時間計算量はO(1)
です。
public boolean add(E e) {
return map.put(e, PRESENT)==null;
}
結論として:
したがって、データ量が多い場合は、List
このcontains()
方法を使用しないでください。効率が非常に低いため、使用を検討してくださいSet
。