349. 两个数组的交集

旧街凉风 提交于 2020-01-21 21:30:16

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

示例 1:

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

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

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


注意一:对于交集中的重复的元素,返回唯一的元素,有两种方法进行处理:第一种,直接用set存放结果,后转化成相应的返回类型,第二种,可以用直接用返回类型来存放,但是查找完之后需要把元素删除掉

注意二:迭代器的end()函数并不指向容器的最后一个元素,是指向容器的最后元素的下一位置


class Solution {
public:
    vector<int> intersection(vector<int>& nums1, vector<int>& nums2) {
        //查找,用set可以降低时间复杂度,
        //返回结果也是唯一,而不是交集所有元素,故用set
        set<int> record;
        for(int i=0;i<nums1.size();i++)
            record.insert(nums1[i]);

        //返回结果也是唯一,而不是交集所有元素,故用set
        set<int> map_record;
        for(int i=0;i<nums2.size();i++)
            if(record.find(nums2[i])!=record.end())
                map_record.insert(nums2[i]);
        //函数返回类型是vector,利用迭代器将set转化成vector
        vector<int> result;
        for(set<int> ::iterator iter=map_record.begin();iter!=map_record.end();iter++)
            result.push_back(*iter);

        return result;
    }
};

简化一:


class Solution {
public:
    vector<int> intersection(vector<int>& nums1, vector<int>& nums2) {
        
        //每种容器都包含迭代器,这种初始化方式,更加的简洁
        set<int> record(nums1.begin(),nums1.end());
        
        set<int> map_record;
        for(int i=0;i<nums2.size();i++)
            if(record.find(nums2[i])!=record.end())
                map_record.insert(nums2[i]);

        //每种容器都包含迭代器,这种初始化方式,更加的简洁
        vector<int> result(map_record.begin(),map_record.end());

        return result;
    }
};

 简化二、


class Solution {
public:
    vector<int> intersection(vector<int>& nums1, vector<int>& nums2) {
        //无序set是基于哈希表的,查找速度惊人,但是面对刷题这种极少数量级的,区别不大
        unordered_set<int> check{nums1.begin(), nums1.end()};
        //此处直接用vector不用set的原因在于,题目要求返回交集的唯一,发现完一个之后,就删除一个元素
        vector<int> result;
        //新for循环
        for (const int& num: nums2)
            if (check.find(num) != check.end()) {
                result.push_back(num);
                //删除已经发现的元素
                check.erase(num);
            }
        
        return result;
    }
};

 

易学教程内所有资源均来自网络或用户发布的内容,如有违反法律规定的内容欢迎反馈
该文章没有解决你所遇到的问题?点击提问,说说你的问题,让更多的人一起探讨吧!