题目链接:
题目描述:
在一个数组(无序)中快速找出两个数字,使得两个数字之和等于一个给定的值。假设数组中肯定存在至少一组满足要求。
题目分析:
我做的是排序加双指针,这个方法不是很好,因为排序会改变对应下标。
参考了这篇博客
用map映射,代码要简洁太多。
<value,index>
的映射关系。
遍历numbers,在映射表中寻找target-numbers[i]。
若找不到则将<numbers[i], i>
加入映射表。
若找到则结束,返回存储的下标+1和当前下标+1。
代码:
方法1:
class Solution {
public:
vector<int> twoSum(vector<int>& nums, int target) {
vector<int> res(2,0);
map<int,int> m;
int len=nums.size();
for(int i=0;i<len;i++){
if(m.find(target-nums[i])==m.end()){
m[nums[i]]=i;
}
else{
res[0]=m[target-nums[i]]+1;
res[1]=i+1;
return res;
}
}
}
};
方法2:
class Solution {
public:
vector<int> twoSum(vector<int>& nums, int target) {
vector<int> nums2(nums);
sort(nums2.begin(),nums2.end());
int len=nums2.size();
int left=0;
int right=len-1;
while(left<right){
if(nums2[left]+nums2[right]==target){
left=nums2[left];
right=nums2[right];
break;
}
else if(nums2[left]+nums2[right]>target){
right--;
}
else{
left++;
}
}
vector<int> res;
for(int i=0;i<len;i++){
if(res.size()==2){
if(res[0]>res[1]){
int tmp=res[0];
res[0]=res[1];
res[1]=tmp;
}
return res;
}
if(nums[i]==left || nums[i]==right){
res.push_back(i+1);
}
}
}
};