1.Two Sum

作者: 闭门造折 | 来源:发表于2018-03-20 15:32 被阅读16次

    Given an array of integers, returnindicesof the two numbers such that they add up to a specific target.
    给定一个integers类型的数组,找出相加等于目标值的两个数,返回他们的索引

    You may assume that each input would haveexactly one solution, and you may not use thesame element twice.
    默认所有的input输入有且只有一个解,且不可以用同一个元素自加

    Example:
    Given nums = [2, 7, 11, 15], target = 9,
    Because nums[0] + nums[1] = 2 + 7 = 9, return [0, 1].

    举例:
    给定数组为[2, 7, 11, 15],目标数字为9
    因为数组第0项+数组第1项=9,所以返回[0, 1]

    拟采用方法:
    将数组各项与数组索引组合成结构体。
    按照各项值对结构体数组快速排序
    从结构体数组第0项往后遍历,直到value>target/2停止,对target-value用二分做查找,若找到则返回索引值
    时间复杂度为O(nlogn)

    如下为C语言初始版本

    #include<stdio.h>
    
    #define MAX_SIZE 20480
    
    struct num_infor{
        int value;
        int location;
    }struct_array[MAX_SIZE];
    
    void swap_struct(struct num_infor *array, int left, int right){
        int value_t = array[left].value;
        int locat_t = array[left].location;
        array[left].value = array[right].value;
        array[left].location = array[right].location;
        array[right].value = value_t;
        array[right].location = locat_t;
        return;
    }
    
    void qsort_struct(struct num_infor *array, int left, int right){
        if(left >= right){
            return;
        }
        int i = left;
        int j = right;
        int key_value = struct_array[left].value;
        int key_locat = struct_array[left].location;
    
        while(i < j){
            while(i < j && key_value <= struct_array[j].value){
                j--;
            }
            swap_struct(struct_array, i, j);
            while(i < j && key_value >= struct_array[i].value){
                i++;
            }
            swap_struct(struct_array, i, j);
        }
        struct_array[i].value = key_value;
        struct_array[i].location = key_locat;
        qsort_struct(array, left, i-1);
        qsort_struct(array, i+1, right);
        return;
    }
    
    int* twoSum(int* nums, int numsSize, int target){
        //init the struct array
        int i;
        int *res = (int *)malloc(sizeof(int) * 2);
        for(i = 0; i < numsSize; i++){
            struct_array[i].value = nums[i];
            struct_array[i].location = i;
        }
        
        //  sort the struct array
        qsort_struct(struct_array, 0, numsSize-1);
    /* 
        for(i = 0; i < numsSize; i++){
            printf("%d---%d\n",struct_array[i].value, struct_array[i].location);
        } 
     */ 
        int min, max, mid;
        for(i = 0; i < numsSize; i++){
            if(struct_array[i].value > target/2){
                break;
            }
            min = i+1;
            max = numsSize - 1;
            while(min <= max){
                mid = (min + max) / 2;
                if(struct_array[i].value + struct_array[mid].value == target){
                    res[0] = struct_array[i].location;
                    res[1] = struct_array[mid].location;
                    if(res[0] > res[1]){
                        i = res[0];
                        res[0] = res[1];
                        res[1] = i;
                    }
                    i = numsSize;
                    break;
                }
                else if(struct_array[i].value + struct_array[mid].value > target){
                    max = mid - 1;
                }
                else{
                    min = mid + 1;
                }
            }
        }
        return res;
    }
    
    int main(){
        int nums[10] = {-1, -2, -3, -4, -5};
        int *answer = NULL;
        answer = twoSum(nums, 5, -8);
        printf("[%d, %d]\n", answer[0], answer[1]);
    }
    //参考自http://blog.csdn.net/gatieme/article/details/50596965
    
    

    个人写的较为繁琐,后来在网络上看到了一个更好理解的解法
    即定义一个n对n的map,遍历所有的数字,在map中寻找对应的target-nums[i]

    class Solution {
    public:
        vector<int> twoSum(vector<int>& nums, int target) {
            map<int, int> mapping;
            vector<int> result;
            for (int i = 0; i < nums.size(); i++)
            {
                mapping[nums[i]] = i;
                //将数组元素->角标的关系存入map中
            }
            for (int i = 0; i < nums.size(); i++)
            {
                int searched = target - nums[i];
                //查找对应的searched值
                if (mapping.find(searched) != mapping.end()
                    && mapping.at(searched) != i)
                {
                    result.push_back(i + 1);
                    result.push_back(mapping[searched] + 1);
                    break;
                }
            }
            return result;     
        }
    };
    选自 http://wiki.jikexueyuan.com/project/leetcode-book/00.html
    

    相关文章

      网友评论

        本文标题:1.Two Sum

        本文链接:https://www.haomeiwen.com/subject/aypnfftx.html