BM50 两数之和
知识点数组哈希
描述
给出一个整型数组 numbers 和一个目标值 target,请在数组中找出两个加起来等于目标值的数的下标,返回的下标按升序排列。(注:返回的数组下标从1开始算起,保证target一定可以由数组里面2个数字相加得到)
数据范围:,
,
要求:空间复杂度
,时间复杂度
示例1
输入:
[3,2,4],6
复制返回值:
[2,3]
复制说明:
因为 2+4=6 ,而 2的下标为2 , 4的下标为3 ,又因为 下标2 < 下标3 ,所以返回[2,3]
示例2
输入:
[20,70,110,150],90
复制返回值:
[1,2]
复制说明:
20+70=90
题解
遍历整个数组,用一个hash表存放数组的值和索引,当目标值和当前值之差在hash表中时,表示已经找到了这两个值,否则将当前值和其索引放入hash表中。
注意:std::unordered_map换成std::map,那么时间复杂度会增加。前者索引时间复杂度为O(1),后者为log(n)。这里不需要有序,std::unordered_map就可以满足需求。
如果这里将
代码如下:
using namespace std;
vector<int> twoSum(vector<int> &numbers, int target)
{
std::unordered_map<int, int> m;
m[numbers[0]] = 0;
std::vector<int> ans;
for (int i = 1; i < numbers.size(); ++i)
{
int val = target - numbers[i];
if (m.find(val) != m.end())
{
ans.push_back(m[val] + 1);
ans.push_back(i + 1);
break;
}
if (m.find(numbers[i]) == m.end())
{
m[numbers[i]] = i;
}
}
return ans;
}