难度:简单
题目链接:https://leetcode-cn.com/problems/two-sum/solution/
问题:
给定一个整数数组 nums
和一个目标值 target
,请你在该数组中找出和为目标值的那 两个 整数,并返回他们的数组下标。
你可以假设每种输入只会对应一个答案。但是,你不能重复利用这个数组中同样的元素。
示例:
给定 nums = [2, 7, 11, 15], target = 9 因为 nums[0] + nums[1] = 2 + 7 = 9 所以返回 [0, 1]
解法:
使用哈希表,将数组元素作为键,数组索引作为值,可以快速的找到目标元素target-x的存在,减少查询所耗费的时间。在C++中,对应的数据结构是map
先将数组中的每个数和它的下标放入map中,然后再遍历数组,判断map中是否存在target-x,并且保证两个数的下标不一致。
vector<int> twoSum(vector<int> nums, int target)
{
map<int, int> num_map;
vector<int> res;
for (int i = 0; i < nums.size(); i++)
{
num_map.insert(map<int, int>::value_type(nums[i], i));
}
for (vector<int>::iterator it = nums.begin(); it != nums.end(); it++)
{
map<int, int>::iterator check = num_map.find(target - *it);
if (check != num_map.end() && it - nums.begin() != check->second)
{
res.push_back((int)(it - nums.begin()));
res.push_back(check->second);
break;
}
}
return res;
}
再进一步优化,每当map中添加一个元素时,都可以做判断,这样就在一定程度上减少了时间复杂度
vector<int> twoSum(vector<int> nums, int target)
{
map<int, int> num_map;
vector<int> res;
for (int i = 0; i < nums.size(); i++)
{
num_map.insert(map<int, int>::value_type(nums[i], i));
map<int, int>::iterator check = num_map.find(target - nums[i]);
if (check != num_map.end() && i != check->second)
{
res.push_back(check->second);
res.push_back(i);
break;
}
}
return res;
}