题源: 349. 两个数组的交集
方法:使用哈希集合
为了快速查找两个数组的交集元素,我们可以利用哈希集合的特性,即快速插入和查找操作。
解题步骤
-
初始化哈希集合:
- 使用
nums1
数组的元素初始化一个名为num_set
的unordered_set
。这个集合用来存储nums1
的元素,同时自动去除任何重复的元素。
- 使用
-
查找交集:
- 遍历
nums2
数组中的每个元素。 - 使用
find
方法检查当前元素是否存在于num_set
中。 - 如果存在,说明该元素在
nums1
和nums2
中都出现过,是交集的一部分,将其插入到结果集合result_set
中。同样,result_set
也是一个unordered_set
,用来确保交集中的元素是唯一的。
- 遍历
-
构造结果向量:
- 使用
result_set
的元素创建一个vector<int>
,并返回这个向量。这步骤使用了result_set.begin()
和result_set.end()
作为迭代器参数,将集合中的元素复制到新的向量中。
- 使用
代码分析
该函数通过两个 unordered_set
对象实现了高效的元素查找和去重。首先,将 nums1
的元素存入 num_set
以去重并提供快速查找功能;然后,通过检查 nums2
的每个元素是否已在 num_set
中出现来确定其是否属于交集。最终,result_set
中存储的即是 nums1
和 nums2
的交集。
复杂度分析
- 时间复杂度:O(n + m),其中 n 和 m 分别是
nums1
和nums2
的长度。具体来说,初始化num_set
的时间复杂度是 O(n),遍历nums2
并查找交集的时间复杂度是 O(m)。 - 空间复杂度:O(n + k),其中 k 是交集中元素的数量。
num_set
至多包含nums1
的所有元素,而result_set
包含的是交集元素。
示例
假设 nums1 = [1, 2, 2, 1]
,nums2 = [2, 2]
,函数会返回 [2]
,因为 2 是两个数组的共同元素,并且在结果中只显示一次。
Code
class Solution {
public:
vector<int> intersection(vector<int>& nums1, vector<int>& nums2) {
unordered_set<int> result_set; //去重后的结果
unordered_set<int> num_set(nums1.begin(), nums1.end()); //把nums1去重保存到num_set中
for(int num : nums2)
if(num_set.find(num) != num_set.end())
result_set.insert(num);
return vector<int> (result_set.begin(), result_set.end());
}
};