1.题目描述
给定两个数组,编写一个函数来计算它们的交集。
示例 1:
示例 2:
说明:
1.输出结果中的每个元素一定是唯一的。
2.我们可以不考虑输出结果的顺序。
2.方法1
分别遍历两个数组并用set保存每个数组的元素,元素较少的set记为s1,元素较多的set记为s2,遍历s1并查找当前遍历的元素是否存在于s2中,如果存在就加入结果数组。
3.代码
class Solution {
public:
vector<int> intersection(vector<int>& nums1, vector<int>& nums2) {
unordered_set<int> s1, s2;
for(auto &num : nums1){
s1.insert(num);
}
for(auto &num : nums2){
s2.insert(num);
}
return getIntersection(s1, s2);
}
vector<int> getIntersection(unordered_set<int>& s1, unordered_set<int>& s2){
if(s1.size() > s2.size()){
return getIntersection(s2, s1);
}
vector<int> res;
for(auto &num : s1){
if(s2.count(num)){
res.push_back(num);
}
}
return res;
}
};
4.复杂度分析
时间复杂度:O(m + n),m,n分别为两个数组的长度
空间复杂度:O(m + n)
5.方法2(排序+双指针)
分别对两个数组排序,设置两个指针index1,index2分别指向两个数组的开头,如果两个指针的元素相等,则加入结果数组(但是要去重,由于数组是有序的,只需要和结果数组的最后一个元素比较即可)且index1++,index2++,如果num1[index1] < nums2[index2],则index1++,否则index2++。
6.代码
class Solution {
public:
vector<int> intersection(vector<int>& nums1, vector<int>& nums2) {
sort(nums1.begin(), nums1.end());
sort(nums2.begin(), nums2.end());
int index1 = 0, index2 = 0;
vector<int> res;
while(index1 < nums1.size() && index2 < nums2.size()){
if(nums1[index1] == nums2[index2]){
if(res.empty() || nums1[index1] != res.back()){
res.push_back(nums1[index1]);
}
index1++;
index2++;
}
else if(nums1[index1] < nums2[index2]){
index1++;
}
else{
index2++;
}
}
return res;
}
};
7.复杂度分析
时间复杂度:O(mlogm + nlogn)
空间复杂度:O(mlogm + nlogn)