第一种方法:
先试用C++内置算法sort来对数组进行排序,然后,从第一个元素开始两两比较,一旦出现相同的就返回true。
class Solution {
public:
bool containsDuplicate(vector<int>& nums) {
sort(nums.begin(),nums.end());
int size=nums.size();
for(int i=0;i<size-1;i++){
//size-1是因为最后一位元素的下标是size-1,所以i的最大值为size-2
if(nums[i]==nums[i+1]){
return true;
}
}
return false;
}
};
第二种:使用哈希表
本题的话,使用unorder_set就可以了。
如果是那种要求返回下标的题目,比如力扣第一题,那么使用unordered_map最好。
补充:leetcode第一题
1.两数之和
给定一个整数数组 nums 和一个整数目标值 target,请你在该数组中找出 和为目标值 target 的那 两个 整数,并返回它们的数组下标。
你可以假设每种输入只会对应一个答案。但是,数组中同一个元素在答案里不能重复出现。
你可以按任意顺序返回答案。
使用unordered_set:
class Solution {
public:
bool containsDuplicate(vector<int>& nums) {
unordered_set<int> s;
int n=nums.size();
for(int x: nums){
if(s.find(x)!=s.end()){
//find,在unordered_set中查找某个元素。
//unordered_set会返回一个迭代器,
//如果查找成功,会返回和参数哈希值匹配的元素。
//如果查找失败,就返回这个容器的结束迭代器。
//在这里,只要对每个元素进行查找,有一个元素找到了,
//满足s.find(x)!=s.end(),就说明存在相同的元素。
return true;
}
s.insert(x);
}
return false;
}
};
也可以使用unordered_map,不过里面的元素都是pair。
class Solution {
public:
bool containsDuplicate(vector<int>& nums) {
unordered_map<int,int> m;
int n=nums.size();
for(auto x: nums){
//注意,x是int类型的
if(m.find(x)!=m.end()){
return true;
}
m.insert(pair<int, int>(x,0));
}
return false;
}
};
注意一下这些容器的find操作。
find(key);
查找key是否存在:
若存在,返回该键的元素的迭代器; 若不存在,返回set.end();
在这里,我们是怎样操作的呢?
find查找的是key的值,那么我们要查找,那就需要将nums元素的值存放在map里面并且作为key的值,而value在这个题上并没有意义,所以我就全部填0。
补充:
返回迭代器。
示例代码:
void test_mapfind()
{
unordered_map<int, string> m;
m.insert(pair<int, string>(3, "three"));
m.insert(pair<int, string>(1, "one"));
m.insert(pair<int, string>(2, "two"));
m.insert(pair<int, string>(3, "three"));
m.insert(pair<int, string>(4, "three"));
int a = 6;
for (auto x: m)
{
if (m.find(x.first) != m.end())
//find里面要填的是key值
{
cout << "找到了";
cout << "key="<<x.first<<",value="<<x.second << endl;
}
else
{
cout << "没有找到" << endl;
}
}
}
结果: