LeetCode #1 Two Sum(C語言)

這道題的最簡單的方法就是經過二重循環暴力解決了。看了解答發現還能夠用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

相關文章
相關標籤/搜索