一、知识点总结

  1. UThash:是一个在GitHub上开源的非常优秀的对哈希表的实现。
  2. 如何使用UThash。

二、使用UThash

  1. 首先创建一个结构体

    struct hashTable{
        int key;  			//键的类型和定义
        int val;  			//值的类型和定义
        UT_hash_handle hh;	//用来表示这个结构体是哈希表类型,照抄。《必须要有》
    };
    

    UT_hash_handle hh; 该行代码是用来表示这个结构体是哈希表类型,照抄。

  2. 使用时,必须定义 该结构体的指针。(使用该指针前,必须先赋值NULL)

    struct hashTable* hashtable = NULL; //使用前必须赋值NULL,也可以在定义时就赋值
    
  3. 自定义查找函数

    struct hashTable* find(int ikey){
        struct hashTable* tmp;
        HASH_FIND_INT(hashtable,&ikey,tmp);
        return tmp;
    }
    
  4. 自定义添加函数

    void insert(int ikey,int ival){
        struct hashTable* it = find(ikey);
        if (it == NULL){
            struct hashTable* tmp = malloc(sizeof(struct hashTable));
            tmp->key = ikey,tmp->val = ival;
            HASH_ADD_INT(hashtable,key,tmp);
        }else{
            it->val = ival;
        }
    }
    
  5. 自定义删除函数

    void delete(int ikey){
        struct hashTable* it = NULL;
        HASH_FIND_INT(hashtable,&ikey,it);
        if (it!=NULL){
            HASH_DEL(hashtable,it);
            free(it);
        }
    }
    

三、对应LeetCode题

1. 两数之和

给定一个整数数组 nums 和一个整数目标值 target,请你在该数组中找出 和为目标值 target 的那 两个 整数,并返回它们的数组下标。

你可以假设每种输入只会对应一个答案。但是,数组中同一个元素在答案里不能重复出现。

你可以按任意顺序返回答案。

利用hash表存下遍历时的值,后面直接查找目标结果。

/**
 * Note: The returned array must be malloced, assume caller calls free().
 */
     struct hashTable{
        int key;
        int val;
        UT_hash_handle hh;
    };
    struct hashTable* hashtabl;

    struct hashTable* find(int ikey){
        struct hashTable* tmp;
        HASH_FIND_INT(hashtabl,&ikey,tmp);
        return tmp;
    }

    void insert(int ikey,int ival){
        struct hashTable* it = find(ikey);
        if (it == NULL){
            struct hashTable* tmp = malloc(sizeof(struct hashTable));
            tmp->key = ikey, tmp->val = ival;
            HASH_ADD_INT(hashtabl,key,tmp);
        }else{
            it->val = ival;
        }
    }
 
int* twoSum(int* nums, int numsSize, int target, int* returnSize){
    hashtabl = NULL;
    int i;
    for (i = 0;i<numsSize;i++){
        struct hashTable* it = find(target-nums[i]);
        if (it!=NULL){
            int * ans = (int *)malloc(sizeof(int)*2);
            ans[0] = it->val;
            ans[1] = i;
            *returnSize = 2;
            return ans;
        }
        insert(nums[i],i);
    }
    *returnSize = 0;
    return NULL;
}
Logo

瓜分20万奖金 获得内推名额 丰厚实物奖励 易参与易上手

更多推荐