Leetcode - Pointers/Array - Two sum

来源:互联网 发布:js button disabled 编辑:程序博客网 时间:2024/05/01 12:04

排序的方法

将数组排序,然后利用前后索引(numBegin指向数组前部,numEnd指向数组尾部)指向已经排序数组的前后元素。

根据下面规则,移动numBegin和numEnd。

1、numbers[numBegin]+numbers[numEnd]>target→numEnd--

2、numbers[numBegin]+numbers[numEnd]<target→numBegin++

3、numbers[numBegin]+numbers[numEnd]=target→numBegin和numEnd所指向的元素便为所求元素。

这时的numBegin和numEnd是所求元素在已经排序的数组内的位置,所以需要在原来数组中寻找所求元素的位置。

注:这里应该sort临时数组temp,不应该sort传递过来的numbers。

注:所求元素有可能值相等,需考虑。

class Solution {public:    vector<int> twoSum(vector<int> &numbers, int target) {        vector<int> temp=numbers;        int numBegin=0;        int numEnd=numbers.size()-1;        vector<int> iRet;        sort(numbers.begin(), numbers.end());        while(numBegin<numEnd)        {            if(numbers[numBegin]+numbers[numEnd]==target)            {                int first=0, second=0;                for(int i=0;i<temp.size();i++)                {                    if(temp[i]==numbers[numBegin]&&first==0)                    {                        first=i+1;                        continue;                    }                    if(temp[i]==numbers[numEnd]&&second==0)                    {                        second=i+1;                        continue;                    }                    if(first*second)                        break;                }                iRet.push_back(min(first,second));                iRet.push_back(max(first,second));                break;            }            if(numbers[numBegin]+numbers[numEnd]>target)                numEnd--;            if(numbers[numBegin]+numbers[numEnd]<target)                numBegin++;        }        return iRet;    }};

map的方法

利用map的下标索引性质:若没有该关键字,则生成该关键字并值初始化。如果map中没有target-numbers[i]该关键字,则将numbers[i]加入map,并赋值为下标号,有的话则OK啦。

class Solution {public:    vector<int> twoSum(vector<int> &numbers, int target) {        map<int, int> numMapper;        vector<int> iRet;        for (int i=0;i<numbers.size();i++)        {            if(numMapper[target-numbers[i]]>0)            {                iRet.push_back(numMapper[target-numbers[i]]);                iRet.push_back(i+1);            }            else                numMapper[numbers[i]]=i+1;        }        return iRet;    }};


0 0