给定一个整数数组 nums 和一个整数目标值 target,请你在该数组中找出 和为目标值 target 的那 两个 整数,并返回它们的数组下标。
你可以假设每种输入只会对应一个答案。但是,数组中同一个元素在答案里不能重复出现。
你可以按任意顺序返回答案。
题目来源:力扣(LeetCode)
链接:https://leetcode-cn.com/problems/two-sum
此代码的时间复杂度为O(n),进行了算法的优化。其中:
1. malloc 是 c 语言中的动态分配内存,result=(int*)malloc(sizeof(int)*2); malloc 函数返回的是 void\* 型,所以要强制类型转换成 int,在前面加上 (int *),才能给整型赋值,后面 (sizeof(int)*2) 的意思是分配两个 int 大小的空间;
2. HASH_ADD_INT,HASH_FIND_INT是力扣网站里面的内置函数。
C语言编写的代码如下图所示:
typedef struct hashTable{
int key; //数组原数值
int val; //数组对应的下标
UT_hash_handle hh; //使此结构体可以hashTable
} hashTable; //给结构体取名为hashTable
hashTable* map = NULL; //哈希表
void add(int ikey, int ival){ //向哈希表添加元素
hashTable* temp = NULL; //定义了一个结构体temp并赋初值为空
//若表中无ikey,则通过HASH_ADD_INT向表中添加元素,若表中有ikey,则修改它存储的元素值
HASH_FIND_INT(map, &ikey, temp); //查找表中是否有值为ikey(确定ikey的唯一性)
if(temp == NULL){ //如果temp为空
temp = (hashTable*)malloc(sizeof(hashTable)); //给temp申请空间
temp->key = ikey; //把ikey的值给temp里面的key
temp->val = ival; //把ikey位置所在的下标给temp里面的val
HASH_ADD_INT(map, key, temp); //向哈希表添加元素
}else{
temp->val = ival; //不满足if条件,则修改更改数组对应的下标
}
}
hashTable* find(int ikey){ //在哈希表中查找目标元素
hashTable* temp = NULL;
HASH_FIND_INT(map, &ikey, temp); //查找哈希表中值为ikey的元素
return temp;
}
int* twoSum(int* nums, int numsSize, int target, int* returnSize){
map = NULL;
int* res = (int*)malloc(sizeof(int) * 2);
*returnSize = 2;
for(int i=0; i < numsSize; ++i){ //遍历数组
hashTable* temp = find(target - nums[i]); //查找满足的元素
if(temp == NULL){ //如果在哈希表中没有找到target - nums[i]
add(nums[i], i); //将该元素添加到哈希表
}else{ //查找到满足的元素,返回下标
res[0] = temp->val;
res[1] = i;
break;
}
}
return res;
}