题目:两数之和
代码(C语言)
/**
* Note: The returned array must be malloced, assume caller calls free().
*/
#define MAX_SIZE 2048
int *twoSum(int *nums, int numsSize, int target, int *returnSize){ //returnSize表示返回数组长度
int i,hash[MAX_SIZE],*res=(int *)malloc(sizeof(int)*2);
//这里是指分配了2个连续的存储空间,即数组的长度 //即后面的res【0】与res【1】,也可以分配更大的。
memset(hash, -1, sizeof(hash)); //memset是初始化函数,这里是初始化hash[2000],初始值设为 -1
for(i = 0;i < numsSize; i++)
{
if(hash[(target-nums[i] + MAX_SIZE) % MAX_SIZE] != -1) //因为有负数,为了防止数组越界
//用了求余法,把负数放在后面了
//这里求得是hash的下标
{
res[0] = hash[(target - nums[i] + MAX_SIZE) % MAX_SIZE];
res[1] = i; //i是nums的下标,是hash的元素
*returnSize = 2; //存在两个数相加得target,所以返回长度为2
return res;
}
hash[(nums[i] + MAX_SIZE) % MAX_SIZE] = i; //防止负数下标越界,循环散列
}
free(hash);
*returnSize = 0; //如果没找到合要求的两个数,则返回长度为0
return res;
}
//参考链接:https://leetcode-cn.com/problems/two-sum/solution/cyu-yan-ji-yu-shu-zu-de-san-lie-15xing-dai-ma-8ms-/