LeetCode.349.350 Intersection of Two Arrays

本文深入解析LeetCode上的两道经典题目:349和350,分别探讨如何找到两个数组的唯一交集和所有交集。通过对比不同解法,包括遍历查找和排序比对,揭示了算法设计的巧妙之处。

题目描述和分析

本博客所介绍的两道题,都是返回两个数组的交,区别在于lc349lc349lc349要求返回的结果内元素独一无二。举一个简单的测试案例,Input:a1=1,2,2,3a2=2,2Input: a1=1,2,2,3 \quad a2=2,2 Input:a1=1,2,2,3a2=2,2 output:lc349(a1,a2)=2lc350(a1,a2)=2,2output: lc349(a1, a2)=2 \quad lc350(a1,a2)=2,2output:lc349(a1,a2)=2lc350(a1,a2)=2,2 虽然这两道题非常相似,但是求解的思路却截然不同。lc349lc349lc349既然只需要保证返回的元素在两个输入数组中都存在过,只需要遍历输入数组的元素,依次判断是否存在于另一数组中。lc350lc350lc350中相同元素相交的个数比较麻烦,这里,作者考虑一种稳妥的做法,先对输入数组升序排序,这样在遍历的过程中不用刻意考虑相交次数这一辣手问题。

代码

lc349lc349lc349

vector<int> intersection(vector<int>& nums1, vector<int>& nums2) {
	vector<int> inte;
	for (unsigned i = 0; i < nums1.size(); i++) {
		if (find(nums2.begin(), nums2.end(), nums1.at(i)) != nums2.end()) {
			if (find(inte.begin(), inte.end(), nums1.at(i)) == inte.end()) {
				inte.push_back(nums1.at(i));
				} 
			}
	}
	return inte;
}

需要注意的是,在遍历过程中,会出现相同的元素,需要增加额外的判断语句。这一解答在LeetCode上实测为12ms,时间复杂度为N(a1.size)N(a1.size)N(a1.size),当然可以每次遍历较短的数组来优化代码,具体的就不演示了。

lc350lc350lc350

vector<int> intersect(vector<int>& nums1, vector<int>& nums2) {
    vector<int> inte;
    // sort two vectors
    sort(nums1.begin(), nums1.end());
    sort(nums2.begin(), nums2.end());
    unsigned i = 0, j = 0;
    while (i < nums1.size() && j < nums2.size()) {
        if (nums1.at(i) == nums2.at(j)) {
            inte.push_back(nums1.at(i));
            i ++;
            j ++;
        } else {
            if (nums1.at(i) > nums2.at(j))
                j ++;
            else
                i ++;
        }
    }
    return inte;
}

这种解法在LeetCode上实测得到8ms,已经到达top了。有的朋友希望通过不排序来做,个人认为需要用到字典来储存已匹配到的相交元素在输入数组中的index。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值