349. 两个数组的交集
给定两个数组 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] 也是可通过的
来源:力扣(LeetCode)
链接:https:///problems/intersection-of-two-arrays
vector<int> intersection(vector<int>& nums1, vector<int>& nums2) {
unordered_set<int> result_set; // 存放结果,使用集合来消除重复元素。
unordered_set<int> nums_set(nums1.begin(), nums1.end()); // 将 nums1 转换为集合。
for (int num : nums2) {
// 如果 nums2 中的当前元素也在 nums_set 中出现
if (nums_set.find(num) != nums_set.end()) {
result_set.insert(num); // 将元素插入结果集合 result_set。
}
}
return vector<int>(result_set.begin(), result_set.end()); // 将 result_set 转换为向量并返回。
}
-
unordered_set<int> result_set;
创建一个名为result_set
的空unordered_set
。这个集合将存储最终的结果,并且使用集合可以确保元素的唯一性,而且元素的顺序无关紧要。 -
unordered_set<int> nums_set(nums1.begin(), nums1.end());
创建一个名为nums_set
的新的unordered_set
,并使用nums1
的元素来初始化它。将vector
转换为unordered_set
的目的是为了在后续的步骤中能够快速查找元素。 -
for
循环遍历nums2
中的每个元素num
。 -
if (nums_set.find(num) != nums_set.end())
检查当前元素num
是否在nums_set
中出现。使用find()
函数在nums_set
中搜索num
,如果返回nums_set.end()
,则表示未找到num
。 -
如果元素
num
在nums_set
中找到,意味着它是nums1
和nums2
的共同元素。在这种情况下,result_set.insert(num);
将元素num
插入到result_set
中。 -
循环结束后,
result_set
包含了nums1
和nums2
的所有共同元素。 -
return vector<int>(result_set.begin(), result_set.end());
通过使用向量的构造函数,传入result_set.begin()
和result_set.end()
的迭代器,将result_set
转换为向量,并作为最终的结果返回。
这段代码的时间复杂度为 O(m + n),其中 m 和 n 分别是 nums1
和 nums2
的长度,因为它遍历了两个数组。空间复杂度为 O(m),其中 m 是 nums1
中不重复的元素个数,因为 nums_set
存储了这些元素。