给定两个数组,编写一个函数来计算它们的交集。
示例 1:
输入: nums1 = [1,2,2,1], nums2 = [2,2]
输出: [2]
示例 2:
输入: nums1 = [4,9,5], nums2 = [9,4,9,8,4]
输出: [9,4]
说明:
输出结果中的每个元素一定是唯一的。
我们可以不考虑输出结果的顺序。
注意一:对于交集中的重复的元素,返回唯一的元素,有两种方法进行处理:第一种,直接用set存放结果,后转化成相应的返回类型,第二种,可以用直接用返回类型来存放,但是查找完之后需要把元素删除掉
注意二:迭代器的end()函数并不指向容器的最后一个元素,是指向容器的最后元素的下一位置
class Solution {
public:
vector<int> intersection(vector<int>& nums1, vector<int>& nums2) {
//查找,用set可以降低时间复杂度,
//返回结果也是唯一,而不是交集所有元素,故用set
set<int> record;
for(int i=0;i<nums1.size();i++)
record.insert(nums1[i]);
//返回结果也是唯一,而不是交集所有元素,故用set
set<int> map_record;
for(int i=0;i<nums2.size();i++)
if(record.find(nums2[i])!=record.end())
map_record.insert(nums2[i]);
//函数返回类型是vector,利用迭代器将set转化成vector
vector<int> result;
for(set<int> ::iterator iter=map_record.begin();iter!=map_record.end();iter++)
result.push_back(*iter);
return result;
}
};
简化一:
class Solution {
public:
vector<int> intersection(vector<int>& nums1, vector<int>& nums2) {
//每种容器都包含迭代器,这种初始化方式,更加的简洁
set<int> record(nums1.begin(),nums1.end());
set<int> map_record;
for(int i=0;i<nums2.size();i++)
if(record.find(nums2[i])!=record.end())
map_record.insert(nums2[i]);
//每种容器都包含迭代器,这种初始化方式,更加的简洁
vector<int> result(map_record.begin(),map_record.end());
return result;
}
};
简化二、
class Solution {
public:
vector<int> intersection(vector<int>& nums1, vector<int>& nums2) {
//无序set是基于哈希表的,查找速度惊人,但是面对刷题这种极少数量级的,区别不大
unordered_set<int> check{nums1.begin(), nums1.end()};
//此处直接用vector不用set的原因在于,题目要求返回交集的唯一,发现完一个之后,就删除一个元素
vector<int> result;
//新for循环
for (const int& num: nums2)
if (check.find(num) != check.end()) {
result.push_back(num);
//删除已经发现的元素
check.erase(num);
}
return result;
}
};
来源:CSDN
作者:工科扫地僧
链接:https://blog.csdn.net/SHAOYEZUIZUISHAUI/article/details/104063518