Day82:两个数组的交集

29 阅读2分钟

给定两个数组 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 的元素。

让我们逐步解释这个代码:

  1. nums_set.find(2):使用 find 函数在 nums_set 中查找值为 2 的元素。

    • 如果找到了,find 函数将返回指向该元素的迭代器,否则返回 nums_set.end(),即指向容器末尾的迭代器。
  2. nums_set.end():返回一个指向 nums_set 结尾位置(即超出有效范围的下一个位置)的迭代器。

  3. (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());  
}