什么时候使用哈希法,当我们需要查询一个元素是否出现过,或者一个元素是否在集合里的时候,就要第一时间想到哈希法。
242. 有效的字母异位词 (opens new window)这道题目是用数组作为哈希表来解决哈希问题,349. 两个数组的交集 (opens new window)这道题目是通过set作为哈希表来解决哈希问题。
本题呢,我就需要一个集合来存放我们遍历过的元素,然后在遍历数组的时候去询问这个集合,某元素是否遍历过,也就是 是否出现在这个集合。
枚举 nums 中的 x,再找数组中是否存在 target -x。在一堆数中找一个数用哈希。
两数之和的求解可以分为以下 3 步:
-
创建一个哈希表。key 存储 nums[i],value 存储 i
-
遍历 nums 数组,对于当前元素 nums[i],查询哈希表中是否存在 target - nums[i]。
-
若存在,返回下标,如不存在,nums[i] 存入哈希表,继续第 2 步。
class Solution {
public:vector<int> twoSum(vector<int>& nums, int target) {unordered_map<int,int> hash;vector<int> out;for(int i = 0; i < nums.size(); i++){if(hash.find(target - nums[i]) != hash.end()){out.push_back(i);out.push_back(hash[target - nums[i]]);break;}hash[nums[i]] = i;}return out;}
};
一开始的错误:
对于当前元素 nums[i],我们需要检查的是 target - nums[i]
是否在哈希表中。
在将结果存入 out
时,你错误地使用了 hash[nums[i]]
而不是 i
。具体来说,out.push_back(hash[nums[i]])
应该是 out.push_back(i)
,因为 i
是当前数字的索引,而 hash[nums[i]]
是之前存储的索引。