1. 题目
查找数组中和为特定值的两个数,返回其下标
假定每个输入都有一个解决方案,你不会使用同一元素两次
2. 分析
本题需要返回的是下标,而不是数字本身
所以不同于 S中是否存在两个其和刚好为x的元素
可以借助哈希表,保存数组中每个数的下标
遍历数组的同时在哈希表中查找即可
3. 代码
1)
class Solution {
public:
vector<int> twoSum(vector<int>& nums, int target) {
vector<int> result;
int len = nums.size();
if(len <= 1)
return result;
unordered_map<int, int> map;
for(int i = 0; i < len; ++i)
map[nums[i]] = i;
for(int i = 0; i < len; ++i)
{
int temp = target - nums[i];
if(map.find(temp) != map.end() && map[temp] > i)
{
result.push_back(i);
result.push_back(map[temp]);
break;
}
}
return result;
}
};
2)
上面的代码其实还可以再精简,当 target - nums[i] 不存在于哈希表中,才将 nums[i] 放入哈希表,否则,找到对应数值的索引,这样就可以省去一次 for循环 和 map[gap] > i 的判断
class Solution {
public:
vector<int> twoSum(vector<int>& nums, int target) {
vector<int> result;
int len = nums.size();
if(len <= 1)
return result;
unordered_map<int, int> map;
for(int i = 0; i < len; ++i)
{
int temp = target - nums[i];
if(map.find(temp) != map.end())
{
result.push_back(map[temp]);
result.push_back(i);
break;
}
map[nums[i]] = i;
}
return result;
}
};