数据结构与算法-两数之和

Posted by 周思进 on August 15, 2019

来源:力扣(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实现哈希还不会… 先记录,回头会了哈希表实现再来重做下这个。