• 两个数组的交集


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

     

    因上求缘,果上努力~~~~ 作者:每天卷学习,转载请注明原文链接:https://www.cnblogs.com/BlairGrowing/p/13454527.html

  • 相关阅读:
    git rebase解决合并冲突
    Google GMS介绍
    MTK Android修改System分区
    Adb adb push (remote write failed: No space left on device)
    Android Visibility控件显示和隐藏
    MTK Android中设置默认时区
    初级Oracle和SQL学习者的学习笔记。韩顺平-玩转oracle。
    网络知识从零开始一:私有地址。
    oracle中有关用户、角色的一些概念。
    oracle中的一些函数笔记
  • 原文地址:https://www.cnblogs.com/BlairGrowing/p/13454527.html
Copyright © 2020-2023  润新知