349. 两个数组的交集
给定两个数组,编写一个函数来计算它们的交集。
示例 1:
输入:nums1 = [1,2,2,1], nums2 = [2,2]
输出:[2]
示例 2:
输入:nums1 = [4,9,5], nums2 = [9,4,9,8,4]
输出:[9,4]
代码:
#include<iostream>
#include<set>
using namespace std;
set<int> st1,st2,st3;
set<int>::iterator it=st1.begin();
set<int> intersection(set<int>& st1,set<int>& st2){
for(it=st2.begin();it!=st2.end();it++){
if (st1.find(*it)!=st1.end())
{
st3.insert(*it);
}
}
return st3;
}
int main(){
int n,num;
cout<<"first set count"<<endl;
cin>>n;
cout<<"Enter first set"<<endl;
for (size_t i = 0; i < n; i++)
{
cin>>num;
st1.insert(num);
}
cout<<"First set "<<endl;
for(it=st1.begin();it!=st1.end();it++){
cout<<*it<<" ";
}
cout<<endl;
cout<<"second set count"<<endl;
cin>>n;
cout<<"Enter second set"<<endl;
for (size_t i = 0; i < n; i++)
{
cin>>num;
st2.insert(num);
}
cout<<"Second set "<<endl;
for(it=st2.begin();it!=st2.end();it++){
cout<<*it<<" ";
}
cout<<endl;
st3=intersection(st1,st2);
if (!st3.empty())
{
cout<<"Their intersection"<<endl;
for(it=st3.begin();it!=st3.end();it++){
cout<<*it<<" ";
}
}else
{
cout<<"empty"<<endl;
}
}
1、两个unordered_set
class Solution {
public:
vector<int> intersection(vector<int>& nums1, vector<int>& nums2) {
// 建立unordered_set存储nums1数组
unordered_set<int> nums1_set(nums1.begin(), nums1.end());
unordered_set<int> ans;
for(auto num : nums2)
{
if(nums1_set.count(num) == 1)
ans.insert(num);
}
// 转为vector
return vector<int>(ans.begin(), ans.end());
}
};
2、一个unordered_set,一个vector
class Solution {
public:
vector<int> intersection(vector<int>& nums1, vector<int>& nums2) {
// 建立unordered_set存储nums1数组
unordered_set<int> nums1_set(nums1.begin(), nums1.end());
vector<int> ans;
for(auto num : nums2)
{
if(nums1_set.erase(num))
// 查找并删除元素num
ans.push_back(num);
}
return ans;
}
};
3、两个set,一个vector
class Solution {
public:
vector<int> intersection(vector<int>& nums1, vector<int>& nums2) {
set<int> nums1_set(nums1.begin(), nums1.end());
set<int> nums2_set(nums2.begin(), nums2.end());
vector<int> ans;
set_intersection(nums1_set.begin(),nums1_set.end(), nums2_set.begin(), nums2_set.end(), insert_iterator<vector<int>> (ans, ans.begin()));
return ans;
}
};
4、一个unordered_map,一个vector
class Solution {
public:
vector<int> intersection(vector<int>& nums1, vector<int>& nums2) {
vector<int> ans;
// 创建一个哈希表
unordered_map<int, int> m;
// 在哈希表中存储数组nums1
for(auto num : nums1)
m[num]++;
// 在数组nums2中查找
for(auto num : nums2)
{
// 在哈希表(nums1)中存在 且 不在ans中
if(m.count(num) != 0 && find(ans.begin(), ans.end(), num) == ans.end())
ans.push_back(num);
}
return ans;
}
};
5、一个set——双指针(sort)
class Solution {
public:
vector<int> intersection(vector<int>& nums1, vector<int>& nums2) {
set<int> s;
sort(nums1.begin(), nums1.end());
sort(nums2.begin(), nums2.end());
vector<int>::iterator i = nums1.begin(), j = nums2.begin();
while(i != nums1.end() && j != nums2.end())
{
if(*i == *j)
{
s.insert(*i);
i++;
j++;
}
else if(*i < *j)
{
i++;
}
else
j++;
}
// 转为vector
return vector<int> ans(s.begin(), s.end());;
}
};