来源:力扣(LeetCode) 链接:https://leetcode-cn.com/problems/two-sum
给定一个整数数组 nums 和一个目标值 target,请你在该数组中找出和为目标值的那两个整数,并返回他们的数组下标。
你可以假设每种输入只会对应一个答案。但是,你不能重复利用这个数组中同样的元素。
示例:
给定 nums = [2, 7, 11, 15], target = 9
因为 nums[0] + nums[1] = 2 + 7 = 9 所以返回 [0, 1]
我能想到的也就暴力破解了…
/**
* Note: The returned array must be malloced, assume caller calls free().
*/
int* twoSum(int* nums, int numsSize, int target, int *returnSize){
int i = 0, j = 0;
int *array = NULL;
// 省去入参判断
array = malloc(2 * sizeof(int));
if (NULL == array)
{
return NULL;
}
for (i = 0; i < numsSize; i++)
{
for (j = i+1; j < numsSize; j++)
{
if (nums[i] == target - nums[j])
{
array[0] = i;
array[1] = j;
*returnSize = 2; // 这个不知道声明这个入参的用途是啥,不赋值,leetcode就执行不通过
return array;
}
}
}
return NULL;
}
问题:
1、看它注释说要malloced,我就malloc了.. 这个也可以设成static静态数组,但这样就是一直占用了内存
2、申请过早了,应该后面找到之后再申请资源,而且过早的申请资源,实际也出现了后面没有找到情况下, 最后return没有释放的问题…
3、以后比较两个数的和是否等于另一个数,应该使用减法比较,避免整数溢出
看了下官方解答说明
为了对运行时间复杂度进行优化,我们需要一种更有效的方法来检查数组中是否存在目标元素。如果存在,我们需要找出它的索引。保持数组中的每个元素与其索引相互对应的最好方法是什么?哈希表。
还可以使用哈希表解决,只是用C实现哈希还不会… 先记录,回头会了哈希表实现再来重做下这个。