题目
给定一个整数数组和一个目标值,找出数组中和为目标值的两个数。
你可以假设每个输入只对应一种答案,且同样的元素不能被重复利用。
示例:
给定 nums = [2, 7, 11, 15], target = 9
因为 nums[0] + nums[1] = 2 + 7 = 9
所以返回 [0, 1]
C语言解法:
1:穷举,此方法简单但低效。
int* twoSum(int* nums, int numsSize, int target) {
int *a = (int*)malloc(2*sizeof(int));//注意返回值要自己分配空间
for(int i = 0;i<numsSize;i++)
{
for(int j = i+1;(j<numsSize && j != i);j++)
{
if(nums[i] + nums[j] == target)
{
a[0] = i;
a[1] = j;
}
}
}
return a;
}
哈希表1:
此代码在数组中数很大的时候会超时。也不好用。所以以后遇见这种题还是两层for循环吧。。。
核心想法是首先根据给出的目标值和组中最小值相减确定哈希表的大小。
哈希表下标和值的关系是table[nums[i]] = i;
在进行迭代并将元素插入到表中的同时,我们还会回过头来检查表中是否已经存在当前元素所对应的目标元素。如果它存在,那我们已经找到了对应解,并立即将其返回
int* twoSum(int* nums, int numsSize, int target) {
int min = INT_MAX;
int i = 0;
for (i = 0; i < numsSize; i++) {
if (nums[i] < min)
min = nums[i];
} //寻找最小值
int max = target - min;
int len = max - min + 1; //确定hash的最大长度,实际需要的长度可能小于此
int *table = (int*)malloc(len*sizeof(int));
int *indice = (int*)malloc(2*sizeof(int));
for (i = 0; i < len; i++) {
table[i] = -1; //hash初值
}
for (i = 0; i < numsSize; i++) {
if (nums[i]-min < len) {
if (table[target-nums[i]] != -1) { //满足相加为target,此部分为代码核心,可借此理解哈希表
indice[0] = table[target-nums[i] ];
indice[1] = i;
return indice;
}
table[nums[i]] = i;
}
}
free(table);//在实际操作中勿忘free
return indice;
}