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, and you may not use the same element twice.
Example:
Given nums = [2, 7, 11, 15], target = 9,
Because nums[0] + nums[1] = 2 + 7 = 9,
return [0, 1].
很简单的一道题,我们最先能想到的应该是暴力法,两个循环,找到两个数满足条件了就记录下来,最后返回,这种方法复杂度O(n^2)
还有另外一种比较快的解法,用hash表来求解,我们也是从头开始遍历,遇见一个数我们就把这个数给存进去,key是这个数,value是对应的下标,我们每走一步往前查询一下是否有target-num[i]这个数,毕竟hash查询复杂度只有O(1),所以最后算法复杂度是O(n)。
代码如下:
/* vector<int> twoSum(vector<int> &nums, int target)
{
vector<int>result;
for(int i=0;i<nums.size()-1;i++)
{
for(int j=i+1;j<nums.size();j++)
{
if(nums[i]+nums[j]==target)
{
result.push_back(i);
result.push_back(j);
}
}
}
return result;
}*/
vector<int> twoSum(vector<int> &nums, int target)
{
vector<int>result;
unordered_map<int, int>m;
for(int i=0;i<nums.size();i++)
{
if(m.find(target-nums[i])!=m.end())
{
result.push_back(m[target-nums[i]]);
result.push_back(i);
}
m[nums[i]] = i;
}
return result;
}