class Solution {
    //方法零:暴力搜索 (n^2) 超出时间限制
    /*public:
    bool containsDuplicate(vector<int>& nums) {
        for(int i=0;i<nums.size();i++){
            for(int j=i+1;j<nums.size();j++){
                if(nums[i]==nums[j]){
                    return true;
                }
            }
        }
        return false;
    }*/
    //方法一:利用set,遍历数组插入,若能查找直接返回true,否则插入,直到最后从未查找成功则说明不存在重复,返回false (set底层用红黑树实现,插入、查找的时间复杂度为o(logn))
  /*public:
    bool containsDuplicate(vector<int>& nums) {
        set<int> s1;
        for (auto i = nums.cbegin(); i != nums.cend(); i++) {
            if(s1.find(*i)!=s1.end())
                return true;
            else
                s1.insert(*i);
        }
        return false;
    }*/
    //方法二:先对数组进行sort排序(o(nlogn)),再遍历排序后数组,比较相邻的两个数是否相同
    /*public:
    bool containsDuplicate(vector<int>& nums) {
        if(nums.empty())
            return false;
        sort(nums.begin(), nums.end());
        for(int i=1;i<nums.size();i++) {
            if(nums[i-1]==nums[i])
                return true;
        }
        return false;
    }*/
    //方法三:哈希散列。类似方法一,但是使用unordered_set(底层用哈希表实现,插入、查找的时间复杂度为o(n))
    public:
    bool containsDuplicate(vector<int>& nums) {
        unordered_set<int> s1;
        for (auto i = nums.cbegin(); i != nums.cend(); i++) {
            if(s1.find(*i)!=s1.end())
                return true;
            else
                s1.insert(*i);
        }
        return false;
    }
};