LeetCode #1 Two Sum(C语言)

这道题的最简单的方法就是通过二重循环暴力解决了。看了解答发现还可以用hash表来实现。于是我打算尝试了一番。因为还没有了解过个hash表,我先大致了解了一下。

其实思路不难,只需要将nums[i]的值hash成某个键值,i为其对应的值即可。在这里我把它这么处理:nums[i] - min(nums) ------ i(如果相应的键不存在对应值则把值置为-1)。

eg:

[2, 4, 5, 7, 10] 
target:9


0 ------ 0
1 ------ -1
2 ------ 1
3 ------ 2
4 ------ -1
5 ------ 3

然后通过查询hash[target -nums[i] - min(nums)],如果不为-1则就是结果。

为什么是target - nums[i] - min(nums)呢?

这是因为键的公式为:nums[i] - min(nums),那么我们要找 x (x + nums[i] = target),就是查找hash[x - min(nums)],即hash[target -nums[i] - min(nums)]。

代码:

/**
 * Note: The returned array must be malloced, assume caller calls free().
 */
int* twoSum(int* nums, int numsSize, int target) {
    int min, max, len, i, *result, *hash;
    result = (int*)malloc(2 * sizeof(int));
    min = nums[0];
    for (i = 0;i < numsSize;i++)
    {
        if (nums[i] < min)
        {
            min = nums[i];
        }
    }
    max = target - min;
    len = max - min + 1;
    hash = (int*)malloc(len * sizeof(int));
    for (i = 0;i < len;i++)
    {
        hash[i] = -1;
    }
    for (i = 0;i < numsSize;i++)
    {
        if (nums[i] <= max)
        {
            hash[nums[i] - min] = i;
        }
    }
    for (i = 0;i < numsSize;i++)
    {
        if (nums[i] <= max && hash[target - nums[i] - min] != -1 && hash[target - nums[i] - min] != i)
        {
            result[0] = i;
            result[1] = hash[target - nums[i] - min];
            break;
        }
    }
    return result;
}

不过尴尬的是这个代码并没有ac ,

这是因为hash表不太适用于变化过大的数据。解决方法还需要再慢慢考虑一下子。

猜你喜欢

转载自www.cnblogs.com/HanLixiang/p/9763178.html
今日推荐