219. 存在重复元素 II-哈希表法

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;


    

}


评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值