第一题:
给定一个整数数组 nums 和一个整数目标值 target,请你在该数组中找出 和为目标值 target 的那 两个 整数,并返回它们的数组下标。
你可以假设每种输入只会对应一个答案。但是,数组中同一个元素在答案里不能重复出现。
你可以按任意顺序返回答案。
思路一:暴力解析----两个for循环,枚举求和,找到即返回。
C语言代码框架:
int* twoSum(int* nums, int numsSize, int target, int* returnSize){
}
返回类型:整型指针
传入参数:
nums是数组,传入的是数组地址(指针);
numsSize 是数组个数;target是目标值;
returnSize是表示返回指针的个数。
官方暴力解题代码:
int* twoSum(int* nums, int numsSize, int target, int* returnSize){
for(int i = 0; i < numsSize; ++i)
{
for(int j = i + 1; j < numsSize; ++j)//内层循环起点是外层的下一个(i+ 1)
{
if(nums[i] + nums[j] == target)
{
int *ret = malloc(sizeof(int) * 2);//和返回类型对应,通过指针来实现返回两个参数
ret[0] = i;
ret[1] = j;
*returnSize = 2;
return ret;
}
}
}
*returnSize = 0;
return NULL; // 找不到一定要返回空指针
}
思路二:创建哈希表,通过查表找到两个数
/**
* Note: The returned array must be malloced, assume caller calls free().
*/
//
struct hashTable
{
int key;
int val;
UT_hash_handle hh; // hh是内部使用的hash处理句柄,必须在该结构体中定义该变量
};
struct hashTable * hashtable; //定义了一个hashtable的变量;注意:没有用typeof,这仅仅是一个变量而非类型
struct hashTable* find(int Key)
{
struct hashTable *tmp;
HASH_FIND_INT(hashtable, &Key, tmp);
return tmp;
}
void insert(int Key, int Val)
{
struct hashTable* it = find(Key);
if(it == NULL)
{
struct hashTable *tmp = malloc(sizeof(struct hashTable));
tmp->key = Key;
tmp->val = Val;
HASH_ADD_INT(hashtable, key, tmp);
}
else
{
it->val = Val;
}
}
int* twoSum(int* nums, int numsSize, int target, int* returnSize)
{
hashtable = NULL;
for(int i = 0; i < numsSize; ++i)
{
struct hashTable *it = find(target - nums[i]);
if(it != NULL)
{
int *ret = malloc(sizeof(int) * 2);
ret[0] = i;
ret[1] = it->val;
*returnSize = 2;
return ret;
}
insert(nums[i], i);
}
*returnSize = 0;
return NULL;
}