题目
提示:
2 <= numbers.length <= 3 * 104
-1000 <= numbers[i] <= 1000
numbers 按 递增顺序 排列
-1000 <= target <= 1000
仅存在一个有效答案
题解
一开始使用双重循环,时间复杂度为O(n^2),超出时间限制
考虑到数组以及升序排列
- 二分查找
遍历数组,在该元素右边二分查找target-numbers[i] - 双指针
左指针为0,右指针为n-1,比较两数和sum与target
sum等于target,输出下标
sum大于target,右指针左移
sum小于target,左指针右移
考虑不会漏掉解
代码
class Solution {
public:
vector<int> twoSum(vector<int>& numbers, int target) {
vector<int> res(2);
int n=numbers.size();
for(int i=0;i<n;i++)
{
int l=i+1,r=n-1;
while(l<=r)
{
int m=(r-l)/2+l;
if(numbers[m]<target-numbers[i])
{
l=m+1;
}
else if(numbers[m]>target-numbers[i])
{
r=m-1;
}
else
{
res[0]=i+1;
res[1]=m+1;
return res;
}
}
}
return res;
}
};
class Solution {
public:
vector<int> twoSum(vector<int>& numbers, int target) {
vector<int> res(2);
int n=numbers.size();
int i=0,j=n-1;
while(i<j)
{
if(numbers[j]+numbers[i]>target)
{
j--;
}
else if(numbers[j]+numbers[i]<target)
{
i++;
}
else
{
res[0]=i+1;
res[1]=j+1;
break;
}
}
return res;
}
};