思想:
哈希,先将所有元素放到hash_table中,然后从头开始扫描,如果两个元素相加等于target,break。
时间复杂度:O(n),空间复杂度:O(n)。
class Solution {
public:
vector<int> twoSum(vector<int> &numbers, int target) {
unordered_map<int, int> mapping;
vector<int> result;
for(int i=0;i<numbers.size();i++) {
mapping[numbers[i]]=i;
}
for(int i=0;i<numbers.size();i++) {
const int gap=target-numbers[i];
if(mapping.find(gap)!=mapping.end() && mapping[gap]>i) {
result.push_back(i+1);
result.push_back(mapping[gap]+1);
break;
}
}
return result;
}
};
方法二:左右夹逼法,但这样无法获取下标。
前提是先排序。
//2Sum
vector<int> twoSum(vector<int> &numbers, int target) {
vector<int> result;
sort(numbers.begin(),numbers.end());
auto i = numbers.begin();
auto j = prev(numbers.end());
while(i<j) {
if(*i + *j > target) {
j--;
while( *j == *(j+1) && i < j) --j;
}else if(*i + *j < target) {
i++;
while( *i == *(i-1) && i < j) ++i;
}
else {
result.push_back(*i);
result.push_back(*j);
break;
}
}
return result;
}