给定一个整数数组 nums
和一个整数目标值 target
,请你在该数组中找出 和为目标值 target
的那 两个 整数,并返回它们的数组下标。
你可以假设每种输入只会对应一个答案,并且你不能使用两次相同的元素。
你可以按任意顺序返回答案。
解法一
/**
* Note: The returned array must be malloced, assume caller calls free().
*/
int* twoSum(int* nums, int numsSize, int target, int* returnSize) {
//先用暴力的方法来做 两层遍历 先确定第一数后面有没有相对应的值
* returnSize=2;
int i=0;
int*loca=(int*)malloc(sizeof(int)*2);
int*index=loca;
int j=0;
int temp=0;
bool in=false;
for(i=0;i<numsSize;i++){
loca[0]=i;
temp=nums[i];
for(j=i+1;j<numsSize;j++){
if(temp+nums[j]==target){
loca[1]=j;
in=true;
return loca;
break;
}
}
if(in==true){
break;
}
}
return loca;
}
上面是用了暴力解法来做的 接下来我们用第二种方法
/**
* Note: The returned array must be malloced, assume caller calls free().
*/
//这里定义一个哈希表的结构
typedef struct{
int loca;
int value;
UT_hash_handle hh;//hash结构的需要
}Hashform;
int* twoSum(int* nums, int numsSize, int target, int* returnSize) {
//下面开始第二种做法 哈希表做法
//哈希表的思想就是 创建一个表 把之前的数组的元素映射到
//哈希表中 在通过检索哈希表 来找到与之相对应另外一个元素
Hashform*in=NULL;//创建一个空的Hash表
Hashform*found;
//先利用一个临时变量来存储相减的差值 在hash表中找 有没有
//如果没有 就把这个原数组的值和位置存入 hash中
int i=0;
//int j=0;
int temp=target+1;
for(i=0;i<numsSize;i++){
temp=target-nums[i];
HASH_FIND_INT(in,&temp,found);//利用c语言库函数查找在创建的哈希表中是否有这个元素的差值
if(found){//如果找到了
* returnSize=2;
int*lo=malloc(sizeof(int)*2);
lo[0]=found->loca;
lo[1]=i;//说明在loca这个表中有 把位置传过去
HASH_CLEAR(hh,in);//释放hash表
return lo;
}//下面就是没有在hash表中找到对应的元素
//把原数组值和位置存入hash中方便下次查找
found=malloc(sizeof(Hashform));
found->value=nums[i];
found->loca=i;
//Hash函数存入
HASH_ADD_INT(in,value,found);
}
return 0;
}