Given an array of integers, return indices of the two numbers such that they add up to a specific target.
You may assume that each input would have exactly one solution.
Example:
Given nums = [2, 7, 11, 15], target = 9,
Because nums[0] + nums[1] = 2 + 7 = 9,
return [0, 1].
第一次做的答案是错的,写完查错一脸懵逼,犯了个低级错误,忘了 sort 排序后下标已经乱了。若题目改为返回元素而不是下标则可以用下面代码。当然你也可以先把元素值和下标先建个映射,不过很麻烦了。
class Solution {
public:
vector<int> twoSum(vector<int>& nums, int target) {
vector<int> res;
sort(nums.begin(),nums.end());
int i=0,j=0;
while(nums[j]<target&&j<nums.size()-1)
++j;
while(i<j){
if(nums[i]+nums[j]==target){
res.push_back(nums[i]);
res.push_back(nums[j]);
return res;
}
else if(nums[i]+nums[j]>target){
--j;
}
else{
++i;
}
}
return res;
}
};
正确姿势:
vector<int> twoSum(vector<int> &numbers, int target)
{
unordered_map<int, int> hash;
vector<int> result;
for (int i = 0; i < numbers.size(); i++) {
int numberToFind = target - numbers[i];
if (hash.find(numberToFind) != hash.end()) {
result.push_back(hash[numberToFind] + 1);
result.push_back(i + 1);
return result;
}
hash[numbers[i]] = i;
}
return result;
}