问题:

给定一个整数数组 nums 和一个整数目标值 target,请你在该数组中找出 和为目标值 target  的那 两个 整数,并返回它们的数组下标。

你可以假设每种输入只会对应一个答案,并且你不能使用两次相同的

示例 1:

输入:nums = [2,7,11,15], target = 9
输出:[0,1]
解释:因为 nums[0] + nums[1] == 9 ,返回 [0, 1] 。

回答:

class Solution {
public:
    vector<int> twoSum(vector<int>& nums, int target) {

// 定义哈希表:key 是数组元素值,value 是元素对应的下标
        unordered_map<int, int> hashtable;
        for (int i = 0; i < nums.size(); ++i) {

// 计算需要找的目标值:target - 当前元素值
            auto it = hashtable.find(target - nums[i]);

auto it:自动推导迭代器类型,it指向查找到的元素,如果没找到则指向hashtable.end()。

// 如果找到了这个值,说明已经遍历过它,直接返回两个下标

判断是否找到了补数:如果it不等于哈希表的末尾迭代器,说明补数存在于哈希表中(也就是之前遍历过的元素里有这个补数)
            if (it != hashtable.end()) {
                return {it->second, i};
            }

找到符合条件的两个数:it->second是补数在数组中的下标,i是当前元素的下标。返回这两个下标组成的向量{it->second, i},函数结束。

//如果没找到补数,就把当前元素值作为键、当前下标作为值存入哈希表,供后续元素查找使用。
            hashtable[nums[i]] = i;
        }
        return {};
    }
};
来源:力扣(LeetCode)
 

知识点:

1.hashtable.find() 的返回规则

在C++的unordered_map(哈希表)中,find()方法的逻辑是:

• 如果找到目标key:返回一个指向该key对应元素的迭代器(iterator)

• 如果没找到目标key:返回一个指向哈希表末尾的迭代器(也就是hashtable.end())

end()是哈希表的一个标记迭代器,它不指向任何真实存储的元素,只是用来表示「查找范围结束,没找到目标」。
这是C++标准容器的统一设计:

• 所有容器的find()方法,找不到时都返回end()迭代器

• 用it != container.end()作为「找到元素」的判断条件

 

2.auto会让编译器在编译阶段根据=右边的表达式,自动推导出变量的类型,不需要我们手动写完整的类型名。
在这行代码里:
auto it = hashtable.find(target - nums[i]);
• hashtable的类型是unordered_map<int, int>
• unordered_map::find()方法的返回值类型是unordered_map<int, int>::iterator(这个类型名很长,写起来很麻烦)
• 编译器会自动把it的类型推导为unordered_map<int, int>::iterator,等价于手动写:
unordered_map<int, int>::iterator it = hashtable.find(target - nums[i]);

更多推荐