leetcode1 两数之和 哈希表
什么时候使用哈希法,当我们需要查询一个元素是否出现过,或者一个元素是否在集合里的时候,就要第一时间想到哈希法。
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]] 是之前存储的索引。
