题目来源
解题方法
双指针
思路:
为什么想到用双指针呢,其中一个比较重要的提示就是递增数组,首先我们可以先用两个变量i,j存储头尾的索引,接着判断nums[i]+nums[j]是否等于目标target,若等于,则直接返回即可,若小于,说明我们需要更大的左部,因此可以选择令i++,若大于,说明我们需要更小的左部,因此可以选择令j- -,循环结束条件即为i==j
附上代码
class Solution {
public:
vector<int> twoSum(vector<int>& nums, int target) {
int i=0;
int j=nums.size()-1;
while(i<j){
if(nums[i]+nums[j]==target)
return {nums[i],nums[j]};
else if(nums[i]+nums[j]<target)
i++;
else
j--;
}
return {};
}
};
哈希表
思路:
可以将题意理解为对于一个数a,(target-a)是否在数组中出现
于是可以先遍历一遍,将数组中的每个数存在hash表中,接着再遍历一遍看看能不能取到对应的数字即可完成
附上代码
class Solution {
public:
vector<int> twoSum(vector<int>& nums, int target) {
map<int,int> map;
for(int i=0;i<nums.size();i++){
map[nums[i]]=1;
}
for(int i=0;i<nums.size();i++){
if(map[target-nums[i]])
return {nums[i], target-nums[i]};
}
return {};
}
};