题解——同时出现的数

题目描述

Medusa同学拿到了2组数字,老师请你编程帮他找出,第2组数中的哪些数,在第1组数中出现了,从小到大输出所有满足条件的数。

比如:

第1组数有:8 7 9 8 2 6 3

第2组数有:9 6 8 3 3 2 10

那么应该输出:2 3 3 6 8 9

输入

第一行两个整数n和m,分别代表2组数的数量

第二行n个正整数

第三行m个正整数

对于60%的数据1≤n,m≤1000,每个数<=2*109

对于100%的数据1≤n,m≤100000,每个数<=2*109

输出

按照要求输出满足条件的数,数与数之间用空格隔开

样例输入

7 7
8 7 9 8 2 6 3
9 6 8 3 3 2 10

样例输出

2 3 3 6 8 9

n,m最大1e5,为避免时间超限,两种解法,一是二分,二是用map。

二分

#include 
using namespace std;
const int M = 1e5;
int a[M+10],b[M+10];
int main()
{
    ios::sync_with_stdio(0);
    cin.tie(0);
    cout.tie(0);
    int n,m,i,x;
    cin >> n >> m;
    for(i = 1;i <= n;i++)
    {
        cin >> a[i];
    }
    for(i = 1;i <= m;i++)
    {
        cin >> b[i];
    }
    sort(a+1,a+n+1);
    sort(b+1,b+m+1);
    int l,r,mid,f;
    for(i = 1;i <= m;i++)
    {
        x = b[i];
        f = 0;
        l = 1;r = n;
        while(l<=r)
        {
            mid = (l+r)/2;
            if(x>a[mid])
            {
                l = mid + 1;
            }
            else if(x

用map,标记a[]中出现过的数

#include      
using namespace std;
const int M = 1e5;
int a[M+10],b[M+10];
map ma;
int main()
{
    int n,m,i,x;
    cin >> n >> m;
    for(i = 1;i <= n;i++)
    {
        cin >> a[i];
        ma[a[i]]=1;
    }
    for(i = 1;i <= m;i++)
    {
        cin >> b[i];
    }
    sort(b+1,b+m+1);
    for(i =1;i <= m;i++)
    {
        if(ma[b[i]]==1)
        {
            cout << b[i] << " ";
        }
    }
    cout << '\n';
    return 0;
}

你可能感兴趣的:(ACM题解,算法,c++)