给定一个已按照升序排列 的有序数组,找到两个数使得它们相加之和等于目标数。函数应该返回这两个下标值 index1 和 index2,其中 index1 必须小于 index2。
说明:返回的下标值(index1 和 index2)不是从零开始的。你可以假设每个输入只对应唯一的答案,而且你不可以重复使用相同的元素。
1. 双指针法
vector<int> twoSum(vector<int>& numbers, int target) {
int begin = 0, end = numbers.size()-1;
while(begin < end)
{
if(numbers[begin] + numbers[end] == target){
return {begin+1, end+1};
}else if(numbers[begin] + numbers[end] > target){
end --;
}else{
begin ++;
}
}
return {-1, -1};
}
2. 二分查找
vector<int> twoSum(vector<int>& numbers, int target) {
vector<int> res;
int tmp,left,right,mid;
for(int i=0;i<numbers.size()-1;i++){
tmp=target-numbers[i];
left=i+1,right=numbers.size()-1;
while(left<=right){
mid=left+(right-left)/2;
if(numbers[mid]==tmp){
res.emplace_back(i+1);
res.emplace_back(mid+1);
break;
}
else if(numbers[mid]<tmp) left=mid+1;
else right=mid-1;
}
}
return res;
}
3. 用map来记录
vector<int> twoSum(vector<int>& numbers, int target) {
unordered_map<int,int> mp;
vector<int> res;
for(int i=0;i<numbers.size();i++) mp[numbers[i]]=i;
for(int i=0;i<numbers.size();i++){
if(mp.count(target-numbers[i])&&mp[target-numbers[i]]!=i){ //同一个不可重复使用
res.emplace_back(i+1);
res.emplace_back(mp[target-numbers[i]]+1);
break;
}
}
return res;
}