您的位置:首页 > 其它

集合A-B--二分查找

2013-04-24 19:10 232 查看
集合A-B的意思是,元素在A且不在B中。

这道题显然不是什么难题。个人水平有限,我喜欢分析这样的水题,这对我个人来讲,有助于培养思维能力,再难的题也是有简单的题复合在一起组成的。

这题有两种方法,一是直接枚举,而是二分查找。显然枚举只对小数有可以,时间复杂度为(n^2)而二分查找先要排序,后查找,时间复杂度为2nlogn,显然我们会采用第二中方法。

输入n,m代表集合A,B元素的个数,接下来是集合A的元素和集合B的元素。输出A-B,若没有元素,就输出NULL。

如果是第一种:

代码如下.0(n^2)

#include<stdio.h>
int main()
{   int i,t=0,a[1000],b[1000],n,m;
while(~scanf("%d%d",&n,&m))
{
for(i=0;i<n;i++)
scanf("%d",&a[i]);
for(i=0;i<m;i++)
scanf("%d",&b[i]);
for(i=0;i<n;i++)
for(int j=0;j<m;j++)
{
if(a[i]==b[j])
break;
if(a[i]!=b[j]&&j==m-1)
{
t++;
printf(t==1?"%d":" %d",a[i]);
}
}
if(!t) printf("NULL");
printf("\n");
t=0;
}
return 0;
}
第二种方法:

代码:o(2nlogn)

#include<cstdio>
#include<algorithm>
using namespace std;
int a[1000],b[1000],m;
int search(int p)
{
int i=0,j=m-1;
while(i<=j)
{
int mid=(i+j)/2;
if(b[mid]==p) return 0;
else if(p<b[mid]) j=mid-1;
else i=mid+1;
}
return 1;
}
int main()
{
int i,j=0,n;
while(~scanf("%d%d",&n,&m))
{
for(i=0;i<n;i++)
scanf("%d",&a[i]);
for(i=0;i<m;i++)
scanf("%d",&b[i]);
sort(b,b+m);
for(i=0;i<n;i++)
if(search(a[i]))
{  j++;
printf(j==1?"%d":" %d",a[i]);
}
if(!j) printf("NULL");
printf("\n");
j=0;
}
return 0;
}
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息