两个数组的交集

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());;
    }
};

 

posted @ 2020-08-07 18:20  图神经网络  阅读(155)  评论(0编辑  收藏  举报
Live2D