zoukankan      html  css  js  c++  java
  • 求集合交集

    给定两个整数集合(每个集合中没有重复元素),集合元素个数<=100000,求两集合交集,并按非降序输出。

    输入格式:

    第一行是n和m,表示两个集合的元素个数; 接下来是n个数和m个数。

    输出格式:

    第一行输出交集元素个数; 第二行按非降序输出交集元素,元素之间以空格分隔,最后一个元素后面没有空格。

    输入样例:

    在这里给出一组输入。例如:

    5 6
    8 6 0 3 1
    1 8 9 0 4 5
    

    输出样例:

    在这里给出相应的输出。例如:

    3
    0 1 8

    #include <iostream>
    #include <algorithm>
    using namespace std;
    int main()
    {  int n,m;
       int a[100000],b[100000],c[200000];//定义数组 
       cin>>n>>m;//

       for (int i=0; i < n; ++i)
             cin>>a[i];

       for (int i=0; i < m; ++i)
             cin>>b[i];//输入指定的数组数据 

       sort(a,a+n);

       sort(b,b+n);//对数组数据进行排序 

       int i=0,j=0,k=0;

       for (; i<n && j<m;) //判断两个数组的数据大小,用数组c记录下相同的数据,并记录好相等的次数(有多少个交集)
    {
           if (a[i]==b[j]) 
                c[k++]=a[i],i++,j++;
          else
          if (a[i]<b[j])
                i++;
          else 
                j++;
    }
       cout<<k<<endl;
       for (int i=0; i < k; ++i) 
    {
             cout<<c[i];//输出数组,按照要求取好空格与最后没有空格 
       if(i!=k-1)
           {    cout<<" ";}
    }
    return 0;
    }

    此题个人觉得难度在于缩短其时间复杂度,一开始想到的算法运行起来的时间复杂度为O(n^2),由于数据量较大,运行超时,所以考虑的算法是先将数组排好序,再对比取交集。

    将时间复杂度降到O(n*logn)便成功通过。以后考虑运行超时的问题可以优先往这样的方向先考虑。

  • 相关阅读:
    敏捷开发读后感
    软工第一次作业总结报告
    个人项目作业week5——敏捷开发方法读后感
    结对项目——电梯调度
    个人项目作业
    个人阅读作业3
    个人阅读作业2
    软件工程基础作业-个人项目代码复审
    电梯调度项目总结
    《移山之道》读后感
  • 原文地址:https://www.cnblogs.com/fengwanthousand/p/10545984.html
Copyright © 2011-2022 走看看