方法一:
将nums数组sort一下,然后使用遍历所有元素,二分查找target-nums[i]是否存在于数组中。
但是这个方法要考虑在对数组元素排序以后,保存该元素的原始位置,所以只能使用pair。相对比较麻烦。
bool cmp(pair<int,int> a, pair<int,int> b){
return a.second < b.second;
}
vector<int> twoSum(vector<int>&nums, int target){
vector< pair<int,int> > toSort;
for(int i = 0; i < nums.size(); i++){
toSort.push_back(make_pair(i,nums[i]));
}
sort(toSort.begin(), toSort.end(), cmp);
vector<int> result;
for(int i = 0; i < toSort.size(); i++){
int kk = -0x3fffff;
kk = lower_bound(toSort.begin()+i+1, toSort.end(), make_pair(0,target-toSort[i].second), cmp)-(toSort.begin()+i+1);
if(kk+i+1<toSort.size() && toSort[kk+i+1].second == target-toSort[i].second){
result.push_back(min(toSort[i].first,toSort[i+kk+1].first));
result.push_back(max(toSort[i].first,toSort[i+kk+1].first));
return result;
}
}
return result;
}
注意:cmp函数要定义为static,放在private中。
方法二:
使用hashmap,在放入每一个元素前,首先查找target-nums[i]是否存在于hashmap中。该方法编程相对简单很多。
vector<int> twoSum(vector<int>&nums, int target){
unordered_map<int, int> mymap;
vector<int> temp;
for(int i = 0; i < nums.size(); i++){
int result = target-nums[i];
if(mymap.find(result) != mymap.end()){
temp.push_back(mymap[result]);
temp.push_back(i);
break;
}
else
mymap[nums[i]] = i;
}
return temp;
}