题目描述:
输入:nums = [2,7,11,15], target = 9
输出:[0,1]
解释:因为 nums[0] + nums[1] == 9 ,返回 [0, 1] 。
来源:力扣(LeetCode)
链接:https://leetcode-cn.com/problems/longest-substring-without-repeating-characters
hash可以快速的查找目标元素是否存在。C语言没有hash,需要自己实现一个有查询功能的。这里采用拉链法hash,即冲突的元素使用链表连在一起。为了防止数字的正负会影响直接取余法构造hash索引,所以用数字绝对值对长度取余做hash索引,在寻找元素时要把自身排除,防止出现返回的结果为[n,n]:表示相同的元素取了两次。查找函数对于某一个元素nums[i],如果hash表中没出现过target - nums[i]或只有本身元素满足条件就返回-1,否则直接索引结果。运行时间8ms,没有free内存代码如下。
/**
* Note: The returned array must be malloced, assume caller calls free().
*/
typedef struct node//节点
{
int key;//hash的键值
int value;//数组的值
int index;//数组的索引
struct node *pNext;
}Node,*pNode,**ppNode;
int load_elem(int len)
{
return (int)(len/2 + 1);
}
ppNode CreateHashMap(int len)//建立hash表
{
ppNode HashMap = (ppNode)malloc(len*sizeof(pNode));
int i = 0;
for(i = 0;i < len;++i)
{
HashMap[i] = NULL;
}
return HashMap;
}
void insertHash(ppNode HashMap,int *array,int len_array,int len_Hash)//根据数组写入hash
{
int i = 0;
int key = 0;
ppNode pp;
pNode p;
for(i = 0;i < len_array;++i)
{
if(array[i]>0)//防止因数组元素的值为0造成key值错误
key = array[i] %len_Hash;
else
key = (-1*array[i])%len_Hash;
pp = HashMap + key;
if((*pp) == NULL)
{
(*pp) = (pNode)malloc(sizeof(Node));
(*pp)->pNext = NULL;
(*pp)->key = key;
(*pp)->value = array[i];
(*pp)->index = i;
}
else
{
p = HashMap[key];
while(p->pNext != NULL)
{
p = p->pNext;
}
p->pNext = (pNode)malloc(sizeof(Node));
p->pNext->key = key;
p->pNext->pNext = NULL;
p->pNext->value = array[i];
p->pNext->index = i;
}
}
}
int findHashMap(ppNode HashMap,int len,int value,int index)//在哈希表中查找
{
int key;
if(value>0)
key= value%len;
else
key= (-1*value)%len;
pNode p = HashMap[key];
while(p != NULL)
{
if(p->value == value && p->index != index)//寻找元素并排除自身
{
return p->index;
}
else
p = p->pNext;
}
return -1;
}
int* twoSum(int* nums, int numsSize, int target, int* returnSize){
int i = 0;
int other = 0;
int returnsize = 2;
int* result = (int*)malloc(2*sizeof(int));
ppNode HashMap = CreateHashMap(load_elem(numsSize));
insertHash(HashMap,nums,numsSize,load_elem(numsSize));
for (i = 0;i<numsSize ;++i)
{
other = findHashMap(HashMap,load_elem(numsSize),target - nums[i],i);
if(other!=-1)
{
result[0] = i;
result[1] = other;
break;
}
}
*returnSize = returnsize;//需要给赋值,要不会输出出错
return result;
}
结果: