
**思路:**懒得写了,如代码所示
c
/**
* Note: The returned array must be malloced, assume caller calls free().
*/
struct hashTable
{
int key;//存值
int val;//存索引
UT_hash_handle hh;
};
int* twoSum(int* nums, int numsSize, int target, int* returnSize)
{
struct hashTable *hash=NULL;//定义一个空哈希数组
*returnSize=2;
int *resnum=(int *)malloc(2*sizeof(int));//定义返回数组
//先将nums写入哈希数组中
for(int i=0;i<numsSize;i++)
{
struct hashTable *tmp;
tmp=(struct hashTable*)malloc(sizeof(struct hashTable));
tmp->key=nums[i];
tmp->val=i;
HASH_ADD_INT(hash, key, tmp);
}
//遍历nums查找哈希数组中是否有相加=target的数
for(int i=0;i<numsSize;i++)
{
int t=target-nums[i];//t暂存需要查找的数
struct hashTable *tmp;//查找结果指针
HASH_FIND_INT(hash,&t,tmp);//查找t是否在哈希数组中,返回值是指针
if(tmp!=NULL&&tmp->val!=i)
{
resnum[0]=i;
resnum[1]=tmp->val;
return resnum;
}
}
return resnum;
}
优化一下,改成边查找边插入,一次循环即可
c
/**
* Note: The returned array must be malloced, assume caller calls free().
*/
struct hashTable
{
int key;//存值
int val;//存索引
UT_hash_handle hh;
};
int* twoSum(int* nums, int numsSize, int target, int* returnSize)
{
struct hashTable *hash=NULL;//定义一个空哈希数组
*returnSize=2;
int *resnum=(int *)malloc(2*sizeof(int));//定义返回数组
//先将nums写入哈希数组中
for(int i=0;i<numsSize;i++)
{
struct hashTable *tmp;//查找结果指针
int t=target-nums[i];//t暂存需要查找的数
HASH_FIND_INT(hash,&t,tmp);//查找t是否在哈希数组中,返回值是指针
if(tmp!=NULL)
{
resnum[0]=i;
resnum[1]=tmp->val;
return resnum;
}
tmp=(struct hashTable*)malloc(sizeof(struct hashTable));//注意这里需要在查找完是否存在后再分配内存,不然tmp会返回为NULL,造成空指针报错
tmp->key=nums[i];
tmp->val=i;
HASH_ADD_INT(hash, key, tmp);
}
return resnum;
}