一、题单
1、两数之和
二、题解
1、两数之和
此题使用暴力解法完全没问题,只是为了熟练使用hash的库函数。
typedef struct {
int key;
int val;
UT_hash_handle hh;
} Hash;
Hash *g_hash;
Hash *FindKey(int key)
{
Hash *tmp;
HASH_FIND_INT(g_hash, &key, tmp);
return tmp;
}
void AddKey(int key, int val)
{
Hash *tmp = FindKey(key);
Hash *it;
if (tmp == NULL) {
it = (Hash *)malloc(sizeof(Hash));
it->key = key;
it->val = val;
HASH_ADD_INT(g_hash, key, it);
} else {
tmp->val = val;
}
}
int* twoSum(int* nums, int numsSize, int target, int* returnSize)
{
int i, j;
*returnSize = 2;
int *res = (int *)malloc(sizeof(int) * (*returnSize));
if (res == NULL) {
*returnSize = 0;
return NULL;
}
g_hash = NULL;
for (i = 0; i < numsSize; i++) {
Hash *tmp = FindKey(target - nums[i]);
if (tmp != NULL) {
res[0] = tmp->val;
res[1] = i;
break;
}
AddKey(nums[i], i);
}
return res;
}
此处需要注意g_hash需要初始化为NULL,否则部分用例不过。
三、总结
1、初级入门
1、使用哈希表库函数时需要包含头文件uthash.h。
2、需要包含自定义的结构体
typedef struct {
int key;
int val;
UT_hash_handle hh;
} Hash;
3、key的类型可以是int,char *,char[],void *、long、结构体等,value可以使任意类型。
字符串:
HASH_ADD_STR(g_hash, key, tmp);
HASH_FIND_STR(g_hash, &key, tmp);
结构体:
HASH_ADD(hh, hashTable, key, sizeof(struct HashTable *), tmp);
HASH_FIND(hh, hashTable, &temp, sizeof(struct HashTable *), tmp);
4、常用的操作:
(1)插入或添加
void add(int key, int value)
{
Hash *tmp = FindKey(key);
if (tmp == NULL) {
Hash *it = (Hash *)malloc(sizeof(Hash));
it->key = key;
it->val = val;
HASH_ADD_INT(g_hash, key, it);
} else {
tmp->val = val;
}
}
(2)查找
Hash *hashFind(int key)
{
Hash *tmp;
HASH_FIND_INT(hash, &key, tmp);
return tmp;
}
(3)删除
void delete(Hash *s)
{
HASH_DEL(hash, s);
free(s);
s == NULL;
}
(4)清空
void clearAll()
{
Hash *cur, *tmp;
HASH_ITER(hh, hash, cur, tmp) {
delete(cur);
}
}
(5)计数
int cnt = HASH_COUNT(hash);