题目描述:
给定两个数组,编写一个函数来计算它们的交集。
示例1:
输入:nums1 = [1,2,2,1], nums2 = [2,2]
输出:[2]
示例2:
输入:nums1 = [4,9,5], nums2 = [9,4,9,8,4]
输出:[9,4]
数组下标法 代码:
#define max 100000
class Solution {
public:
int a[max][2];
vector<int> intersection(vector<int>& nums1, vector<int>& nums2) {
int n=nums1.size(),s=nums2.size();
vector<int> v;
memset(a,0,sizeof(a));
for(int i=0;i<n;i++){
a[nums1[i]][0]=1;
}
for(int i=0;i<s;i++){
a[nums2[i]][1]=1;
}
for(int i=0;i<max;i++){
if(a[i][0]==1&&a[i][1]==1){
v.push_back(i);
}
}
return v;
}
};
数组下标法,用数组记录下标数字是否在两个输入数组中都出现过,简单粗暴,时间复杂度O(n+m)但时间效率和空间效率都不好。
排序法 代码:
#include<set>
class Solution {
public:
vector<int> intersection(vector<int>& nums1, vector<int>& nums2) {
int n=nums1.size(),s=nums2.size();
vector<int> v;
sort(nums1.begin(),nums1.end());
sort(nums2.begin(),nums2.end());
int temp1=0,temp2=0;
int m=0;
while(true){
cout<<temp1<<" "<<temp2<<endl;
if(temp1==n-1&&temp2==s-1){
if(nums1[temp1]==nums2[temp2]){
v.push_back(nums1[temp1]);
}
break;
}
if(nums1[temp1]==nums2[temp2]){
v.push_back(nums1[temp1]);
if(temp1<n-1)
temp1++;
if(temp2<s-1)
temp2++;
}
else if(nums1[temp1]<nums2[temp2]){
if(temp1==n-1)break;
if(temp1<n-1)
temp1++;
}
else if(nums1[temp1]>nums2[temp2]){
if(temp2==s-1)break;
if(temp2<s-1)
temp2++;
}
m++;
}
set<int> ss(v.begin(), v.end());
v.assign(ss.begin(), ss.end());
return v;
}
};
快排两个数组,从头到尾遍历比较元素是否相同。时间复杂度O(nlogn+mlogm),空间效率提高,时间效率没有提高。
哈希法 代码:
class Solution {
public:
vector<int> intersection(vector<int>& nums1, vector<int>& nums2) {
unordered_set<int> set1, set2;
int n=nums1.size(),s=nums2.size();
for(int i=0;i<n;i++){
set1.insert(nums1[i]);
}
for(int i=0;i<s;i++){
set2.insert(nums2[i]);
}
return getIntersection(set1, set2);
}
vector<int> getIntersection(unordered_set<int>& set1, unordered_set<int>& set2) {
//set1长度大于等于set2
if (set1.size() > set2.size()) {
//如果set1长度小于set2,把参数反过来
return getIntersection(set2, set1);
}
vector<int> intersection;
for(unordered_set<int>::iterator it = set1.begin(); it != set1.end(); ++it){
//遍历set1,若其中元素在set2中出现,则把该元素加入vector中(注意在短set中查找依次长set中的元素)
if (set2.count(*it)){
intersection.push_back(*it);
}
}
return intersection;
}
};
上面两个方法在排序和查找上时间复杂度较大,用哈希法时间复杂度O(1)进行查找。
使用stl中无序容器unordered_set保存输入的数组,进行数组去重。
扫描二维码关注公众号,回复:
13162831 查看本文章

再遍历数组1的元素,在set2中哈希查找该元素是否存在(set中的count()函数就是哈希查找)。
总体时间复杂度为O(m+n)。