两个数组的交集
题目
给定两个数组,编写一个函数来计算它们的交集。
说明:
输出结果中的每个元素一定是唯一的。
我们可以不考虑输出结果的顺序。
示例
输入:nums1 = [1,2,2,1], nums2 = [2,2]
输出:[2]
题解
方法 1 两个集合
计算数组的交集,可以通过遍历一个数组,判断其中的每一个元素是否出现在另一个数组中,而判断的时间复杂度为 O(n) 较高,可以通过将数组转换为哈希集合的方法降低其时间复杂度为 O(1) 。
因此,使用两个哈希集合分别存储两个数组中的元素,遍历较小的集合,判断其是否出现在另一个集合中,若出现,则将其添加到返回值。
方法 2 排序+双指针
求得两数组元素的交集,可以采用先排序,再利用双指针的方法求解。
定义两指针,若指向元素相等,且不等于上一个加入答案的元素(避免重复元素),则将其加入答案;若指向元素不相等,则将指向较小元素的指针右移。任一数组遍历完成时求解结束。
代码
方法 1 两个集合
class Solution {
public:
vector<int> intersection(vector<int>& nums1, vector<int>& nums2) {
//unordered_set 去除重复元素
unordered_set<int> set1,set2;
for(auto& num:nums1){
set1.insert(num);
}
for(auto& num:nums2){
set2.insert(num);
}
return getIntersection(set1,set2);
}
vector<int> getIntersection(unordered_set<int> set1,unordered_set<int> set2){
if(set1.size()>set2.size()){
return getIntersection(set2,set1);
}
vector<int> intersection;
for(auto& num:set1){
if(set2.count(num)){
intersection.push_back(num);
}
}
return intersection;
}
};
方法 2 排序+双指针
class Solution {
public:
vector<int> intersection(vector<int>& nums1, vector<int>& nums2) {
//对数组元素进行排序
//重复元素必然连续
sort(nums1.begin(),nums1.end());
sort(nums2.begin(),nums2.end());
int length1=nums1.size(),length2=nums2.size();
int index1=0,index2=0;
vector<int> intersection;
//双指针遍历
while(index1<length1&&index2<length2){
if(nums1[index1]==nums2[index2]){
//注意判断条件顺序
//避免重复元素
//back() 返回当前vector容器中末尾元素的引用
if(!intersection.size()||nums1[index1]!=intersection.back()){
intersection.push_back(nums1[index1]);
}
index1++;
index2++;
}
else if(nums1[index1]<nums2[index2]){
index1++;
}
else{
index2++;
}
}
return intersection;
}
};