这道题的最简单的方法就是经过二重循环暴力解决了。看了解答发现还能够用hash表来实现。因而我打算尝试了一番。由于尚未了解过个hash表,我先大体了解了一下。spa
其实思路不难,只须要将nums[i]的值hash成某个键值,i为其对应的值便可。在这里我把它这么处理:nums[i] - min(nums) ------ i(若是相应的键不存在对应值则把值置为-1)。code
eg:blog
[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则就是结果。get
为何是target - nums[i] - min(nums)呢?hash
这是由于键的公式为:nums[i] - min(nums),那么咱们要找 x (x + nums[i] = target),就是查找hash[x - min(nums)],即hash[target -nums[i] - min(nums)]。class
代码:循环
/** * 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表不太适用于变化过大的数据。解决方法还须要再慢慢考虑一会儿。im