//除去暴力搜索,依旧是两个思路
//思路一:先对数组进行sort排序(o(nlogn)),再遍历排序后数组,比较相邻的两个数是否相同。与问题Ⅰ不同的是,这里需要构造一个结构体来记录元素对应的位置,并重写comp()函数以便对结构体数组使用sort()排序。struct ElementWithPosition
{
int num;
int pos;
};
class Solution {
public:
bool static comp(ElementWithPosition a,ElementWithPosition b){
return a.num<b.num;
}
bool containsNearbyDuplicate(vector<int>& nums, int k) {
if(nums.empty()||k<=0)
return false;
ElementWithPosition eles[nums.size()];
for(int i=0;i<nums.size();i++){
eles[i].num=nums[i];
eles[i].pos=i;
}
sort(eles,eles+nums.size(),comp);
for(int i=1;i<nums.size();i++){
if ( eles[i].num == eles[i-1].num && abs(eles[i].pos - eles[i-1].pos) <= k )
return true;
}
return false;
}
};
//思路二:利用哈希散列(n)。利用 hashmap, key 为 vector 中的数, value 存放对应的下标。 遍历 vector, 若当前值已经存在于 hashmap 中,判断当前的下标与 hashmap 中记录的下标差是否不大于 k, 若是,返回 true; 否则,更新 hashmap 中该值的下标,继续下一个数。
class Solution {
public:
bool containsNearbyDuplicate(vector<int>& nums, int k) {
unordered_map<int,int>map;
for(int i =0; i < nums.size(); i++)
{
if(map.count(nums[i])!=NULL&&i-map[nums[i]]<=k) return true;
map[nums[i]] = i;
}
return false;
}
};