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 <= 10^5
-10^9 <= nums[i] <= 10^9
代码示例:
(1)
class Solution {
public:
bool containsDuplicate(vector<int>& nums)
{
set<int>num1;
for(auto x:nums)
{
num1.insert(x);
}
if(nums.size()==num1.size())
{
return 0;
}
return 1;
}
};
第一时间想到的是用set容器的特性:不存在重复元素。把vector里面的每一个元素insert进set容器中,然后比较set容器和原来的vector的长度,如果一样长,则没有重复元素,如果不一样长,则有重复元素。
结果证明方法确实可行,但是因为时间复杂度大,提示中数据量很大导致花了很长时间,而且内存占用高达七十兆,显然是不太好的。
接下来就想办法优化一下算法
第二次的代码如下:
class Solution {
public:
bool containsDuplicate(vector<int>& nums)
{
sort(nums.begin(),nums.end());
int x = nums.size();
for(int i = 0;i<x-1;i++)
{
if(nums[i]==nums[i+1])
{
return 1;
}
}
return 0;
}
};
这一次利用sort函数,把vector的元素排好序,然后通过比较相邻的元素是否相等来判断是否存在相等的元素。这样的好处在于代码更简洁,耗时以及内存更小