题意:给定两个数组,编写一个函数来计算它们的交集。
那么用数组来做哈希表也是不错的选择,例如242. 有效的字母异位词(opens new window)
但是要注意,使用数组来做哈希的题目,是因为题目都限制了数值的大小。
而这道题目没有限制数值的大小,就无法使用数组来做哈希表了。
而且如果哈希值比较少、特别分散、跨度非常大,使用数组就造成空间的极大浪费。
那么就可以考虑用set来做,效率最高最常用的就是unordered_set
unordered_set和vector一样也是一种容器,在定义的时候也是显示定义。
例如:unordered_set<int> result_set;
class Solution {
public:
vector<int> intersection(vector<int>& nums1, vector<int>& nums2) {
unordered_set<int> result_set; // 定义result_set存放结果,之所以用set是为了给结果集去重
unordered_set<int> nums_set(nums1.begin(), nums1.end());//把数组nums1的值存入nums_set。
for (int num : nums2) //这行代码使用了C++11中的范围-based for 循环,可以在不需要索引的情况下遍历一个容器中所有元素。在这里,对nums2中的每个元素都执行一次循环体,每次迭代时将当前元素赋值给变量num。
{
// 发现nums2的元素 在nums_set里又出现过,容器的find函数,如果要寻找的元素在该容器中出现,就返回指向该元素的迭代器(即!=nums_set.end()),if条件满足。把该元素插入到result_set。如果如果find函数要寻找的元素没有在容器中,就会返回指向集合末尾的迭代器,即等于nums_set.end(),if判断条件不成立,进行下一次for循环。
if (nums_set.find(num) != nums_set.end())
{
result_set.insert(num);
}
}
return vector<int>(result_set.begin(), result_set.end()); //要求返回数组,则把结果set的元素复制到数组里面。这行代码是在函数中使用了匿名对象。在C++中,可以使用匿名对象来直接作为函数的返回值。匿名对象是在函数返回时创建的临时对象,它不需要被命名,因为它的生命周期仅限于这个语句。
}
};
注意:
1.第一次使用unordered_set这个容器,对其如何定义以及初始化跟vector类似。
2.for循环中的-based for循环,可以在不需要索引的情况下,把目标容器的元素依次赋值给定义的变量,对定义好的哈希表进行遍历哈希表中的所有元素很方便。
3.利用容器的find函数,来判断该容器中是否存在要查找的元素,如果存在返回该元素的迭代器,不存在返回容器.end()。
总结:本题是结合unordered_set与哈希表的经典案例,哈希表就是想判断容器中的某个元素是否存在。该题目的实质就是想判断数组1的元素是否在数组2中存在,如果存在就添加到交集集合中。
先把数组1的所有元素放到哈希表nums_set中,然后对数组2进行遍历,用nums_set.find(num)函数来判断数组2的元素是否在哈希表中。
出自:代码随想录