先排序,首位各有一个指针,根据加起来的值和target的大小作比较移动指针。输出索引的方法:排序前赋值一份,找到值之后从头到尾再找一遍。
class Solution {
public:
vector<int> twoSum(vector<int> &numbers, int target) {
sort(numbers.begin(), numbers.end());
int i = 0;
int j = numbers.size()-1;
while (numbers[i]+numbers[j]!=target)
{
if (numbers[i] + numbers[j] > target) j--;
if (numbers[i] + numbers[j] < target) i++;
}
vector<int> res;
for (int k = 0; k < numbers.size();k++)
if (copy[k] == numbers[i] || copy[k] == numbers[j])
res.push_back(k);
return res;
}
};
网上的方法为使用空间换取时间,即使用Hashmap来建立数字和其坐标位置之间的映射,我们都知道HashMap是常数级的查找效率,这样,我们在遍历数组的时候,用target减去遍历到的数字,就是另一个需要的数字了,直接在HashMap中查找其是否存在即可,注意要判断查找到的数字不是第一个数字,比如target是4,遍历到了一个2,那么另外一个2不能是之前那个2。
class Solution {
public:
vector<int> twoSum(vector<int>& nums, int target) {
unordered_map<int, int> m;
vector<int> res;
for (int i = 0; i < nums.size(); ++i) {
m[nums[i]] = i;
}
for (int i = 0; i < nums.size(); ++i) {
int t = target - nums[i];
if (m.count(t) && m[t] != i) {
res.push_back(i);
res.push_back(m[t]);
break;
}
}
return res;
}
};
或者把两个for合并成一个,便找边放:
class Solution {
public:
vector<int> twoSum(vector<int>& nums, int target) {
unordered_map<int, int> m;
for (int i = 0; i < nums.size(); ++i) {
if (m.count(target - nums[i])) {
return {i, m[target - nums[i]]};
}
m[nums[i]] = i;
}
return {};
}
};