1、首先,范围在整数内,且有可能不连续,因此考虑提取最大元素与最小元素,构造一个能够为原数组中正负所有元素索引的空间,max+(min < 0 ? abs(min) : 0) + 1
作为大小,对每一个nums[i]
对应的位置标记(注意min为负数导致的偏移)。
2、利用hash表也是一种思路
3、vector有min_element()
函数,用迭代器确定位置,可以写成begin(arr)
也可以写成arr.begin()
,返回迭代器,使用时要解引用;
class Solution {
public:
bool containsDuplicate(vector<int>& nums) {
if(nums.empty() || nums.size() == 1)
return false;
vector<int>::iterator iterMax, iterMin;
iterMax = max_element(nums.begin(), nums.end());
iterMin = min_element(begin(nums), end(nums));
int maxEle = *iterMax;
int minEle = *iterMin;
if(minEle < 0)
minEle = -minEle;
else
minEle = 0;
int flagSize = maxEle + minEle + 1;
vector<int> flag(flagSize, 0);
for(int i = 0; i < nums.size(); i++){
if(flag[nums[i] + minEle] == -1)
return true;
flag[nums[i] + minEle] = -1;
}
return false;
}
};
class Solution {
public:
bool containsDuplicate(vector<int>& nums) {
unordered_set<int> visited;
for(int i = 0; i < nums.size(); i++){
if(visited.find(nums[i]) == visited.end())
visited.insert(nums[i]);
else
return true;
}
return false;
}
};