题目描述:给定一个升序排列的数组和另外一个数target,若数组中某两个数的和等于target,输出这两个数的索引。假设只有一个解,索引从1开始(注意不是从0开始)。
解题思路:双指针问题。两个指针,左指针在数组头,右指针在数组尾。
- 若两者之和等于target,则返回索引;
- 若两者之和大于target,则右指针左移;
- 若两者之和小于target,则左指针右移;
C++实现如下:
class Solution {
public:
vector<int> twoSum(vector<int>& numbers, int target)
{
vector<int> ret(, -);
//左指针
int left = ;
//右指针
int right = numbers.size() - ;
while(left < right)
{
int temp = numbers[left] + numbers[right];
if(temp == target)
{
ret[] = left + ;
ret[] = right + ;
return ret;
}
else if(temp < target)
left ++;
else
right --;
}
}
};
20180711更新
class Solution
{
public:
vector<int> twoSum(vector<int>& numbers, int target)
{
vector<int> ret;
int length = numbers.size();
int p = ;
int q = length - ;
while(p < q)
{
if(numbers[p] + numbers[q] > target)
q--;
else if(numbers[p] + numbers[q] < target)
p++;
else
{
ret.push_back(p + ); //务必加1
ret.push_back(q + );
break; //此时break,否则会超时
}
}
return ret;
}
};