开始想先遍历一遍数组把每个元素加入map,之后再进行查询,但发现下面这个示例过不了(输出会变为[0, 0])
所以实际上需要把所有操作在一次遍历中解决,这样就能实现每次查询map都只查询自己前方的元素了
本质还是根据一个key对哈希表进行查询
<aside> 💡 思路:target确定了,那么能和一个数相加得到target的值也唯一确定。 使用这个数本身作为key查询互补数,或是使用其互补数作为key查询这个数都行。
</aside>
由于不仅需要存储数的值还需要存储其对应的下标,所以使用map构建哈希表
// 将数组中每个数的下标作为val,将其与target的差值作为key存入map,
// 之后数组中如果出现了key值则其对应的val就是与其互补的数
vector<int> twoSum(vector<int>& nums, int target) {
// 第一个值存储与target的差值,第二个值存储下标
unordered_map<int, int> record;
for (int i = 0; i < nums.size(); ++i) {
if (record.find(nums[i]) == record.end())
record.insert(std::make_pair(target - nums[i], i));
else
return { record.find(nums[i])->second, i };
}
// 不写返回力扣编译器无法通过
return { 0, 0 };
}