1. 两数之和
思路与解法
当遍历到某一元素时,比如 3,当要求两数之和为 9 时,需要看 6 在之前有没有出现过,也就是某元素是否出现在这个集合中,那么我们就应该想到使用哈希法了。
因为本题我们不仅要知道元素有没有遍历过,还要知道这个元素对应的下标,需要使用 key、value 结构来存放,key 来存元素,value 来存下标,那么使用 map 正合适。
这道题目中并不需要 key 有序,选择 std::unordered_map 效率更高!
Map 的目的:
是用来存放我们访问过的元素,因为遍历数组的时候,需要记录我们之前遍历过哪些元素和对应的下标,这样才能找到与当前元素相匹配的(即相加等于 target)。
Map 中 key 和 value 分别表示什么:
在 map 里:
- key:键,用来查找,本题为元素的值
- value:值,表示这个键对应的数据,本题为元素对应的索引
这道题我们需要给出一个元素,判断这个元素是否出现过,如果出现过,返回这个元素的下标。
那么判断元素是否出现,这个元素的值就作为 key,因为 map 的作用是最快地查找 key 是否在 map 中出现过。所以数组中的元素作为 key,有 key 对应的就是 value,value 用来存下标。所以 map 中的存储结构为 {key: 数据元素,value: 数组元素对应的下标}。
在遍历数组的时候,只需要向 map 去查询是否有和目前遍历元素匹配的数值,如果有,就找到了匹配对,如果没有,就把目前遍历的元素放进 map 中,因为 map 存放的就是我们访问过的元素。
整体思路:定义 unordered_map——寻找,找到返回,未找到就添加——最终没有匹配的返回空!
class Solution {
public:
vector<int> twoSum(vector<int>& nums, int target) {
unordered_map<int, int> map;
for (int i = 0; i < nums.size(); i++) {
auto it = map.find(target - nums[i]);
if (it != map.end()) {
return {it->second, i};
}
map.insert({nums[i], i});
}
return {};
}
};
【注】
map.find(…):unordered_map的成员函数,用于查找指定的键。参数是要查找的键(key),返回一个迭代器(pair<const Key, Value> 类型)。

