排序的方法
将数组排序,然后利用前后索引(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;
}
};