两个数组的交集

本文介绍了如何使用C++编程语言解决给定两个有序数组的交集问题,利用双指针策略,保证输出结果中每个元素唯一且按从小到大顺序排列。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

题目描述

题目描述

给定两个数组 nums1 和 nums2 ,返回 它们的交集 。输出结果中的每个元素一定是 唯一 的。按照从小到大的顺序输出两个数组的交集。

输入格式

第一行输入两个整数  和 ,分别表示nums1 和 nums2 两个数组元素数量。

第二行输入个空格分开的整数,表示nums1 数组。

第二行输入个空格分开的整数,表示nums2 数组。

输出格式

按照从小到大的顺序输出两个数组的交集。

样例
样例输入1

4 2 1 2 2 1 2 2   

样例输出1

2

样例输入2

3 5

4 9 5

9 4 9 8 4

样例输出2

4 9

这是一道典型的双指针题目

双指针,就是用两个指针指向位置(下标),根据不同的情况改变其中一个指针的位置,从而实现快速地查找。

回到这道题,既然是从小到大输出,那么我们就可以把两个数组排个序

sort(a,a+n);
sort(b,b+m);

接着从头开始找相同的地方,如果a[i]小了,就把 i 往后移一位,因为越后面越大,如果 b[j]小了,就把 j 往后移一位,从而实现找到相同,如果相同了,而且这个数没被找过(题目要求不重复),输出a[i],并且标记a[i],接着两个数都往后移一位

完整代码如下:

#include<bits/stdc++.h>
using namespace std;
const int N=1e3+5;
int a[N],b[N];
int n,m;
map<int,bool>mp;
signed main(){
	scanf("%d%d",&n,&m);
	for(int i=0;i<n;i++)scanf("%d",&a[i]);
	for(int i=0;i<m;i++)scanf("%d",&b[i]);
	sort(a,a+n);
	sort(b,b+m);
	int i=0,j=0;
	while(i<n&&j<m){
		if(a[i]<b[j])i++;
		else if(a[i]>b[j])j++;
		else{
			if(mp[a[i]]==0){
				printf("%d ",a[i]);
				mp[a[i]]=1;
			}
			i++;
			j++;
		}
	}
}

评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值