219. 存在重复元素 II-哈希表法
给你一个整数数组 nums 和一个整数 k ,判断数组中是否存在两个 不同的索引 i 和 j ,满足 nums[i] == nums[j] 且 abs(i - j) <= k 。如果存在,返回 true ;否则,返回 false 。
示例 1:
输入:nums = [1,2,3,1], k = 3
输出:true
示例 2:
输入:nums = [1,0,1,1], k = 1
输出:true
示例 3:
输入:nums = [1,2,3,1,2,3], k = 2
输出:false
这题虽然是个简单的题目,但是显然是并不简单的,解题代码如下:
#define size 17347
struct hash{
struct hash *next;
int val;
int index;
};
void add_hash(struct hash* h,int val,int index){
struct hash*p=(struct hash *)malloc(sizeof(struct hash ));
p->index=index;
p->val=val;
p->next=h->next;
h->next=p;
}
int find(struct hash *h,int index,int val){
struct hash*p=h->next;
int min=size;
int re_index=size;
while(p){
if(p->val==val&&index!=p->index){
re_index=fmin(re_index,abs(index-p->index));
}
p=p->next;
}
if(re_index!=size){
return re_index;
}
else{
return -1;
}
}
bool containsNearbyDuplicate(int* nums, int numsSize, int k){
struct hash *h=(struct hash *)malloc(sizeof(struct hash )*size);
for(int i=0;i<size;i++){
(h+i)->next=NULL;
}
for(int i=0;i<numsSize;i++){
add_hash(h+abs(nums[i])%size,nums[i],i);
}
for(int i=0;i<numsSize;i++){
int val=find(h+abs(nums[i])%size,i,nums[i]);
if(val<=k&&val!=-1){
return true;
}
}
return false;
}