题目描述
题目描述
给定两个数组 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++;
}
}
}