217. 存在重復(fù)元素(力扣)
題目:
給你一個(gè)整數(shù)數(shù)組 nums 。如果任一值在數(shù)組中出現(xiàn) 至少兩次 ,返回 true ;如果數(shù)組中每個(gè)元素互不相同,返回 false 。
示例 1:
輸入:nums = [1,2,3,1]
輸出:true
示例 2:
輸入:nums = [1,2,3,4]
輸出:false
示例 3:
輸入:nums = [1,1,1,3,3,4,3,2,4,2]
輸出:true
提示:
1 <= nums.length <= 105
-109 <= nums[i] <= 109
來源:力扣(LeetCode)
鏈接:https://leetcode.cn/problems/contains-duplicate
著作權(quán)歸領(lǐng)扣網(wǎng)絡(luò)所有。商業(yè)轉(zhuǎn)載請聯(lián)系官方授權(quán),非商業(yè)轉(zhuǎn)載請注明出處。

第一種錯(cuò)法:
class?Solution?{
public:
????bool?containsDuplicate(vector<int>&?nums)?{
????????????for(int?i=0;i<nums.size();i++){
????????????????if(find(nums.begin(),nums.end(),nums[i])!=find(nums.end(),nums.begin(),nums[i])){return?true;}
????????????}
????????????return?false;
????}
};
這里find()函數(shù)不是這樣用的,find(nums.end(),nums.begin(),nums[i])不是從數(shù)組尾部開始找的意思
find()的返回值是迭代器,第一個(gè)地方填開始地址,第二個(gè)地方填結(jié)束地址,第三個(gè)地方填要查找的數(shù)字。
第一種對法:
class?Solution?{
public:
????bool?containsDuplicate(vector<int>&?nums)?{
????????????sort(nums.begin(),nums.end());
????????????for(int?i=1;i<nums.size();i++){
????????????????if(nums[i]==nums[i-1])return?true;
????????????}
????????????return?false;
????}
};
先排序,看前后的元素是否相等
執(zhí)行用時(shí):108 ms, 在所有?C++?提交中擊敗了33.89%的用戶
內(nèi)存消耗:55.9 MB, 在所有?C++?提交中擊敗了37.48%的用戶
第二種對法:
class?Solution?{
public:
????bool?containsDuplicate(vector<int>&?nums)?{
???????????return?set<int>(nums.begin(),nums.end()).size()!=nums.size();
????}
};
運(yùn)用set的去重加排序特性,將set的大小跟沒有去重的nums做對比
執(zhí)行用時(shí):152 ms, 在所有?C++?提交中擊敗了8.82%的用戶
內(nèi)存消耗:71.7 MB, 在所有?C++?提交中擊敗了5.04%的用戶
第三種對法:
class?Solution?{
public:
????bool?containsDuplicate(vector<int>&?nums)?{
????????????unordered_set<int>?s;
????????????for(int?x:nums){
????????????????if(s.find(x)!=s.end()){
????????????????????return?true;
????????????????}
????????????????s.insert(x);
????????????}
????????????return?false;
????}
};
哈希表用法,時(shí)間復(fù)雜度O(n)