LeetCode_cpp:0349.两个数组的交集【简单】

这篇博客介绍了如何利用C++标准库中的set_intersection函数求解两个数组的交集。文章通过示例展示了函数的用法,并强调了输入序列必须升序且不重复的要求。此外,还提供了三种不同的实现方式,包括直接使用原始数组、转换为set以及排序后计算交集的方法,对比了它们的时间和空间效率。
摘要由CSDN通过智能技术生成

题目

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

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

来源:力扣(LeetCode)
链接:https://leetcode-cn.com/problems/intersection-of-two-arrays

题解

  • 重点不在题解,在于cpp官方函数 set_intersection 的应用,条件还是蛮苛刻的,所以去看看官方文档比较好
  • 更多细节请看源代码版本

代码

#include "../Jx_test.h"

//set_intersection()函数的限制比较多
//	输入的两个序列需要是升序的,并且是不重复的
//	说白了是为set量身定做的,但是升序、不重复的其他序列也是可以的
//	否则结果要么不是交集,要么就会有重复的元素
vector<int> intersection_Jx001(vector<int>& nums1, vector<int>& nums2)
{
	vector<int> res;
	set_intersection(nums1.begin(), nums1.end(), nums2.begin(), nums2.end(),
		inserter(res, res.begin()));
	return res;
}

//time:8 ms	//memory:10.6 MB	//rank:55.47%
vector<int> intersection_Jx002(vector<int>& nums1, vector<int>& nums2)
{
	set<int> set_nums1(nums1.begin(), nums1.end());
	set<int> set_nums2(nums2.begin(), nums2.end());
	vector<int> res;

	set_intersection(set_nums1.begin(), set_nums1.end(), set_nums2.begin(), set_nums2.end(),
		inserter(res, res.begin()));
	return res;
}

//在代码中进行注释
//time:4 ms	//memory:9.6 MB	//rank:91.45%
vector<int> intersection_Eg001(vector<int>& nums1, vector<int>& nums2) {
    //先将两个序列进行排序
    sort(nums1.begin(), nums1.end());
    sort(nums2.begin(), nums2.end());
    int len1 = nums1.size(), len2 = nums2.size();
    int i = 0, j = 0;
    vector<int> ret;
    while (i < len1 && j < len2) {  //退出循环的条件
        //三个条件包含所有情况,满足一个就跳入循环
        //  两个元素相同时
        if (nums1[i] == nums2[j]) {
            //两个元素相同时,如果ret为空直接压入
            //两个元素相同时,ret不为空,元素不等于尾数也立即压入
            if (!ret.size() || nums1[i] != ret.back()) {
                ret.emplace_back(nums1[i]);
            }
            //求交集,因此 i++;j++; 均可向后移动
            i++; j++;
        }
        //  哪个小,哪个往后移,去寻找是否有交集
        else if (nums1[i] < nums2[j]) {
            i++;
        }
        else {
            j++;
        }
    }
    return ret;
}
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

Jacob-xyb

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值