给定两个数组 nums1
和 nums2
,返回 它们的交集 。输出结果中的每个元素一定是 唯一 的。我们可以 不考虑输出结果的顺序 。
示例 1:
输入: nums1 = [1,2,2,1], nums2 = [2,2]
输出: [2]
示例 2:
输入: nums1 = [4,9,5], nums2 = [9,4,9,8,4]
输出: [9,4]
解释: [4,9] 也是可通过的
思路
std::unordered_map 底层实现为哈希表,std::map 和std::multimap 的底层实现是红黑树。同理,std::map 和std::multimap 的key也是有序的(这个问题也经常作为面试题,考察对语言容器底层的理解)。
当我们要使用集合来解决哈希问题的时候,优先使用unordered_set,因为它的查询和增删效率是最优的,如果需要集合是有序的,那么就用set,如果要求不仅有序还要有重复数据的话,那么就用multiset。
unordered_set会自动去重所以非常适合本题要求。
(nums_set.find(2) != nums_set.end())
这句代码的作用是判断在 unordered_set
容器 nums_set
中是否存在元素值为 2 的元素。
让我们逐步解释这个代码:
-
nums_set.find(2)
:使用find
函数在nums_set
中查找值为 2 的元素。- 如果找到了,
find
函数将返回指向该元素的迭代器,否则返回nums_set.end()
,即指向容器末尾的迭代器。
- 如果找到了,
-
nums_set.end()
:返回一个指向nums_set
结尾位置(即超出有效范围的下一个位置)的迭代器。 -
(nums_set.find(2) != nums_set.end())
:通过比较find(2)
返回的迭代器和nums_set.end()
的值,判断2
是否存在于nums_set
中。- 如果
2
存在于nums_set
中,find(2)
将返回指向2
的迭代器,与nums_set.end()
不相等,条件成立。 - 如果
2
不存在于nums_set
中,find(2)
将返回nums_set.end()
,与nums_set.end()
相等,条件不成立。
- 如果
因此,(nums_set.find(2) != nums_set.end())
的结果可以用来判断 2
是否存在于 nums_set
中。如果条件成立,表示 2
存在;如果条件不成立,表示 2
不存在。你可以根据这个结果执行相应的操作,例如输出信息或进行其他处理。
vector<int> intersection(vector<int>& nums1, vector<int>& nums2) {
unordered_set<int> result_set;
unordered_set<int> temp_set (nums1.begin(),nums1.end());
for(int temp : nums2){
if (temp_set.find(temp) != temp_set.end()){
result_set.insert(temp);
}
}
return vector<int> (result_set.begin(),result_set.end());
}