[剣はoffer.03を指します]配列内の繰り返し番号

トピック:

配列内の繰り返し番号を見つけます。

長さ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ループがあるため、時間複雑方法がありますArrayListcontains()indexOf()indexOf()ArrayListcontains()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

おすすめ

転載: blog.csdn.net/qq_44624536/article/details/113824397