Leetcode_349. 两个数组的交集

349. 两个数组的交集

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

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

示例 2:

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

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

思路:直接使用set_intersection函数求交集
set_intersection要求两个区间必须是有序的(从小到大排列)
函数源码

template<class InputIterator1,class InputIterator2,class OutputIterator>
OutputIterator set_intersection(InputIterator1 first1,InputIterator1 last1,InputIterator2 first2,InputIterator2 last2,OutputIterator result)
{
	while (first1!=last1 && first2!=last2) //若均未到达尾端,则进行以下操作
	{
		//在两个区间内分别移动迭代器。若二者值相同用result记录该值,移动first1,first2和result
		//若first1较小,则移动first1,其他不动
		//若first2较小,则移动first2,其他不动
		if (*first1<*first2)  		
			first1++;			
		else if (*first2<*first1)			
			first2++;		
		else
		{	
			*result=*first1;
			first1++;
			first2++;		
			result++;
		}		
	}	
	return result; 	
}

class Solution {
public:
    vector<int> intersection(vector<int>& nums1, vector<int>& nums2)
    {
        vector<int> ans;
        set<int> s1(nums1.begin(), nums1.end());
        set<int> s2(nums2.begin(), nums2.end());
        set_intersection(s1.begin(),s1.end(), s2.begin(), s2.end(), insert_iterator<vector<int>> (ans, ans.begin()));

        return ans;
    }
};

思路2:同样的根据源码,自然而然的就有了双指针+排序的方法

class Solution {
public:
    vector<int> intersection(vector<int>& nums1, vector<int>& nums2)
    {
        sort(nums1.begin(), nums1.end());
        sort(nums2.begin(), nums2.end());
        set<int> s;
        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<int> ans(s.begin(), s.end());
        return ans;
    }
};

其他思路:将nums1存入set 然后遍历nums2,如果能找到能够擦除的元素,说明找到了交集
这里还要明确一下 set和unordered_set的区别
set基于红黑树实现,红黑树具有自动排序的功能,因此map内部所有的数据,在任何时候,都是有序的。
unordered_set基于哈希表,数据插入和查找的时间复杂度很低,几乎是常数时间,而代价是消耗比较多的内存,无自动排序功能。底层实现上,使用一个下标范围比较大的数组来存储元素,形成很多的桶,利用hash函数对key进行映射到不同区域进行保存。

class Solution {
public:
    vector<int> intersection(vector<int>& nums1, vector<int>& nums2)
    {
        vector<int> ans;
        unordered_set<int> s(nums1.begin(), nums1.end());
        for(auto &i : nums2){
            if(s.erase(i)){
                ans.push_back(i);
            }
        }
        return ans;
    }
};
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值