[力扣167. 两数之和 II - 输入有序数组] (map,双指针)
题目

思路:
题目求找两个和为 terget 的数
terget=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;
}
};
结果:

该博客主要介绍了LeetCode第167题的两种解决方案:使用哈希映射和双指针。通过哈希映射可以在O(n)的时间复杂度内找到目标,而双指针法通过不断调整左右指针来寻找目标和,同样达到O(n)的时间复杂度。这两种方法都是针对有序数组寻找唯一答案的有效策略。
1041

被折叠的 条评论
为什么被折叠?



