[力扣167. 两数之和 II - 输入有序数组] (map,双指针)
题目
思路:
题目求找两个和为 terget 的数
t
e
r
g
e
t
=
a
+
b
terget=a+b
terget=a+b
我们固定一个 a ,那么 b 的值也是唯一的
每次遍历到当前的数时,可以找唯一的b有没有出现
因为题目只有一个唯一的答案,所以找到的直接return
没找到就把当前a的下标存到map中l
代码:
class Solution {
public:
vector<int> twoSum(vector<int>& numbers, int target) {
map<int,int> hashmap;//初始化map
for(int i=0;i<numbers.size();i++){
if(hashmap[target-numbers[i]]!=0){//找到了当前number[i]对应的唯一的b就直接返回
vector<int> re;
re.push_back(hashmap[target-numbers[i]]);
re.push_back(i+1);
return re;
}
hashmap[numbers[i]]=i+1;//没找到就把当前number[i]的下标存进map
}
vector<int> re;
return re;
}
};
结果:
双指针思路:
定义两个指针 左端点 l, 右端点 r
如果 numbers[l]+numbers[r]小于target的话,应该让左端点往右移动,因为右端点是当前的最大值
如果 numbers[l]+numbers[r]大于target的话,那就得让右端点往左移一位
直到 左右端点的值相加刚好等于 target
代码:
class Solution {
public:
vector<int> twoSum(vector<int>& numbers, int target) {
int l=0,r=numbers.size()-1;
vector<int> re;
while(l<=r){
if(numbers[l]+numbers[r]<target){//小于的话左端点加一
l++;
}else if(numbers[l]+numbers[r]>target){//大于的话右端点减一
r--;
}else{
//相等的话就返回下标
re.push_back(l+1);
re.push_back(r+1);
return re;
}
}
return re;
}
};
结果: