349. 两个数组的交集

给定两个数组,编写一个函数来计算它们的交集。

示例 1:

输入: nums1 = [1,2,2,1], nums2 = [2,2]
输出: [2]

示例 2:

输入: nums1 = [4,9,5], nums2 = [9,4,9,8,4]
输出: [9,4]

说明:

  • 输出结果中的每个元素一定是唯一的。
  • 我们可以不考虑输出结果的顺序。

方法一:

思路:

取数组1和数组2中不重复的元素:用一个set s1存第一个数组的元素,再用一个set s2存第二个数组的元素

计算s1和s2中的元素的总出现次数:然后用一个map<int,int> m,遍历s1和s2,将对应的元素的映射加1

这样的话,映射中大于1的元素就是数组1和数组2中重复的元素了

代码:

class Solution {
public:
    vector<int> intersection(vector<int>& nums1, vector<int>& nums2) {
        set<int> s1;
        for(int i=0;i<nums1.size();i++)        //数组1存到set s1中
        {
            s1.insert(nums1[i]);
        }
        
        set<int> s2;
        for(int i=0;i<nums2.size();i++)       //数组2存到set s2中
        {
            s2.insert(nums2[i]);
        }
        
        map<int,int> m;
        set<int>::iterator temp;
        for(temp=s1.begin();temp!=s1.end();temp++)       //将s1中的元素的映射加1
        {
            m[*temp]++;
        }
        for(temp=s2.begin();temp!=s2.end();temp++)       //将s2中的元素的映射加1
        {
            m[*temp]++;
        }
        vector<int> res;
        for(int i=0;i<nums1.size();i++)
        {
            s2.insert(nums1[i]);
        }
        for(temp=s2.begin();temp!=s2.end();temp++)     //如果映射大于1,就存到要返回的数组中
        {
            if(m[*temp]>1)
                res.push_back(*temp);
        }
        
        return res;
    }
};

效率不高:

349. 两个数组的交集

方法二:

思路:

将数组1排序,并去掉重复的元素

将数组2排序,并去掉重复的元素

用一个指针n1指向数组1的开始,用一个指针n2指向数组2的开始

在n1和n2不越界的情况下,不断循环判断*n1和*n2的大小关系:

如果相等,则把元素输入到要返回的数组,n1++,n2++

如果*n1>*n2,则n2++直到不满足前面条件为止

如果*n2>*n1,则n1++直到不满足前面条件为止

这样,就可以把所有重复的元素找出来了

代码:

class Solution {
public:
    vector<int> intersection(vector<int>& nums1, vector<int>& nums2) {
        vector<int> rev;
        if(nums1.empty() ||nums2.empty())             //如果数组其中一个为空,直接返回空数组
            return rev;
        sort(nums1.begin(),nums1.end());                    //将数组1排序
        vector<int>::iterator temp;
        for(temp=nums1.begin();temp<nums1.end()-1;)        //去掉数组1中重复的元素
        {
            if(*temp==*(temp+1))
            {
                nums1.erase(temp);
            }
            else
                temp++;
        }    
        sort(nums2.begin(),nums2.end());                    //将数组2排序
        for(temp=nums2.begin();temp<nums2.end()-1;)        //去掉数组2中重复的元素
        {
            if(*temp==*(temp+1))
            {
                nums2.erase(temp);
            }
            else
                temp++;
        }
        vector<int>::iterator n1=nums1.begin(),n2=nums2.begin();    //设定指针n1和n2
        while(n1<nums1.end() &&n2<nums2.end())                //在n1和n2不越界的条件下循环
        {
            if(*n1==*n2)                                       //*n1==*n2的情况
            {
                rev.push_back(*n1);
                n1++;
                n2++;
            }
            while(*n1>*n2 && n2<nums2.end())                   //*n1>*n2的情况
                n2++;
            while(*n1<*n2 &&n1<nums1.end() )                   //*n1<*n2的情况
                n1++;
        }
        return rev;
    }
};

效率非常高:

349. 两个数组的交集