题目描述为:一个按照升序排序后的数组,给一个目标数,从数组中找到两个数,相加之后等于目标数,返回其这两个数的索引,假定一定存在这样的两个数,并且一个数不可以重复使用,索引不是以1开始的,并且第二个数的索引要比第一个数的索引要大。
我的愚蠢思路:对于所有能组成的数对组合,遍历一遍,如果二者相加等于目标数,就返回。同时,加了一个小trick,先找到比目标数大的索引,那么这个索引和之后的都不需要遍历,AC代码如下:
class Solution {
public:
vector<int> twoSum(vector<int>& numbers, int target) {
int length=0;
int i,j,k;
vector<int> indexs;
for(i=0;i<numbers.size();i++)
{
length++;
if(numbers[i]>target)
{
break;
}
}
for(j=0;j<length;j++)
{
for(k=j+1;k<length;k++)
{
if(numbers[j]+numbers[k]==target)
{
if(j!=k)
{
indexs.push_back(j+1);
indexs.push_back(k+1);
return indexs;}
}
}
}
}
};
看了讨论区,看了大神的解题思路,思路为,从头和从尾同时开始遍历,如何相加大于目标函数,尾索引向前移,如果小于目标函数,头索引向后移,复杂度就变成了O(N),代码如下:
class Solution {
public:
vector<int> twoSum(vector<int>& numbers, int target) {
int lo=0, hi=numbers.size()-1;
while (numbers[lo]+numbers[hi]!=target){
if (numbers[lo]+numbers[hi]<target){
lo++;
} else {
hi--;
}
}
return vector<int>({lo+1,hi+1});
}
};