Two Sum

来源:互联网 发布:云计算主流技术 编辑:程序博客网 时间:2024/04/29 00:27

注释的部分是普通解法o(n^2)

排序使数组是有序的,O(nlgn)的时间复杂度(注意用到了快排!)就可以解决了,此题注意小标即可!指针从俩边向中间靠拢!


#include<algorithm>struct num_type    {    int val;    int pos;    };    bool cmp(num_type a,num_type b)    {    return a.val < b.val;    }    class Solution {public:             vector<int> twoSum(vector<int> &numbers, int target)  {        // IMPORTANT: Please reset any member data you declared, as        // the same Solution instance will be reused for each test case./*vector<int> index;        for(vector<int>::iterator it = numbers.begin(); it != numbers.end(); ++ it){for(vector<int>::iterator second = it+1; second != numbers.end(); ++ second){if ((*it + *second) == target){index.push_back(it-numbers.begin()+1);index.push_back(second-numbers.begin()+1);}}}return index;*/ vector<int> index; vector<num_type> sort_numbers; int sum; for (vector<int>::iterator it = numbers.begin();it != numbers.end();it++) {num_type temp;temp.val = *it;temp.pos = it-numbers.begin();sort_numbers.push_back(temp); } sort(sort_numbers.begin(),sort_numbers.end(),cmp);//排序 vector<num_type>::iterator begin_pos,end_pos; begin_pos = sort_numbers.begin(); end_pos = sort_numbers.end()-1;//下标要注意! while(begin_pos != end_pos) {sum = (*begin_pos).val + (*end_pos).val;if (sum == target){if ((*begin_pos).pos < (*end_pos).pos){index.push_back((*begin_pos).pos+1);index.push_back((*end_pos).pos+1);}else{index.push_back((*end_pos).pos+1);index.push_back((*begin_pos).pos+1);}break;}else if (sum < target)//以下为首位指针向俩边靠拢!{begin_pos++;}else{end_pos--;} } return index;    }};

第二次:此题在编程之美有,第一思路是用hash_map 来做(已知第一个,查第二个很快)。但是由于hash_map 是扩展的STL非标准,在vs2008 使用时需加上 using namespacce stdext;  vs2008 其功能较完善,测试了下支持string,不用自己自定义!

此处用的排序,再用双端指针,向中间夹逼!

class Solution {        struct data_t    {        int val;        int pos;    };    struct cmp_t    {        bool operator()(data_t t1,data_t t2)        {            return t1.val < t2.val;        }    };    public:    vector<int> twoSum(vector<int> &numbers, int target)     {        if(numbers.size()<2) return vector<int>();                vector<data_t> data(numbers.size());        for(int i = 0;i < numbers.size();i++)        {             data[i].val =   numbers[i];               data[i].pos =   i+1;         }                       sort(data.begin(),data.end(),cmp_t());                int left = 0;        int right = numbers.size()-1;        int sum = 0;        vector<int> res(2);                while(left < right)        {            sum = data[left].val + data[right].val;            if(sum == target)            {                 if(data[left].pos > data[right].pos )                 {                     res[0] =  data[right].pos;                     res[1] =  data[left].pos;                 }                 else                 {                     res[0] =  data[left].pos;                     res[1] =  data[right].pos;                 }                 return res;            }            else if(sum < target)            {                left++;            }            else            {                right--;            }        }                return vector<int>();    }};