C++哈希表实现两数之和
问题:
给定一个整数数组 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]);
更多推荐

所有评论(0)