题目
给定一个整数数组,判断是否存在重复元素。
如果存在一值在数组中出现至少两次,函数返回 true 。如果数组中每个元素都不相同,则返回 false 。
第一种方法:排序后再比较
初始代码:暴力求解
class Solution {
public:
bool containsDuplicate(vector<int>& num) {
int length = num.size() ;
if (length == 0) return false;
for(int left = 0; left<=length-2;left++ ){
for(int right=left+1;right<=length-1;right++){
if(num[left] == num[right]) return true;
}
}
return false;
}
};
没问题,但是超出时间限制,毕竟俩for循化
所以我们
思路:排序后再比较
先对数组进行排序,这样,数值相同的元素会挨在一起,所以我们只需要相邻两元素两两比较即可
class Solution {
public:
bool containsDuplicate(vector<int>& num) {
int length = num.size() ;
sort(num.begin(),num.end());
for(int i=0;i<length-1;i++){
if(num[i]==num[i+1]) return true;
}
return false;
}
};
注意:sort 对 vector 的写法
sort(nums.begin(), nums.end());
第二种方法: set集合
思路:
集合中的元素互异,添加的时候如果有重复的,就会覆盖掉之前相同的值,并且返回 false
我们遍历数组中元素加入set 看会不会实现 return false 的情况即可判断
注意:1. 如何建立set
unordered_set<int> s;
注意:2. int num : arr
int num : arr
迭代器遍历,对于数组来说,等同于
for(int i=0;i<arr.length;i++){
int num = arr[i];
...
}
注意:3. unordered_set 的三个函数
C++ STL 之 unordered_set 使用(包括unordersd_map)
unordered_set 内部实现是基于哈希表(hashtable)
unordered_set::insert
unordered_set::find
unordered_set::erase
查找函数 find() 通过给定主键查找元素
如果s.find()要找的值在set中则返回一个指向该值的迭代器,
如果没有找到则返回s.end()。
set<int> s;
if(s.find(x)==s.end())//x不在set<int> s中
{
s.insert(x);//执行操作
}
代码
class Solution {
public:
bool containsDuplicate(vector<int>& nums) {
unordered_set<int> s;
for(int x: nums){
if (s.find(x) != s.end()) { //x在set<int> s中
return true;
}
s.insert(x); //x不在set<int> s中 就插入
}
return false;
}
};