217. 存在重复元素(力扣)
题目:
给你一个整数数组 nums 。如果任一值在数组中出现 至少两次 ,返回 true ;如果数组中每个元素互不相同,返回 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
著作权归领扣网络所有。商业转载请联系官方授权,非商业转载请注明出处。

第一种错法:
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()函数不是这样用的,find(nums.end(),nums.begin(),nums[i])不是从数组尾部开始找的意思
find()的返回值是迭代器,第一个地方填开始地址,第二个地方填结束地址,第三个地方填要查找的数字。
第一种对法:
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;
}
};
先排序,看前后的元素是否相等
执行用时:108 ms, 在所有 C++ 提交中击败了33.89%的用户
内存消耗:55.9 MB, 在所有 C++ 提交中击败了37.48%的用户
第二种对法:
class Solution {
public:
bool containsDuplicate(vector<int>& nums) {
return set<int>(nums.begin(),nums.end()).size()!=nums.size();
}
};
运用set的去重加排序特性,将set的大小跟没有去重的nums做对比
执行用时:152 ms, 在所有 C++ 提交中击败了8.82%的用户
内存消耗: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;
}
};
哈希表用法,时间复杂度O(n)