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