集合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)
代码:o(2nlogn)
这道题显然不是什么难题。个人水平有限,我喜欢分析这样的水题,这对我个人来讲,有助于培养思维能力,再难的题也是有简单的题复合在一起组成的。
这题有两种方法,一是直接枚举,而是二分查找。显然枚举只对小数有可以,时间复杂度为(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; }
相关文章推荐
- 分治思想 - 二分搜索技术 - MATLAB代码 list是数据集合,x是要查找的数据。
- 在无序集合的递归二分查找
- 349. Intersection of Two Arrays --双指针、字典、二分查找、集合
- ssl1125-集合【哈希表&二分查找+快排】
- 【Hash】【二分查找】17.6.3 集合 题解
- 二分查找判定树
- 洛谷P3345 [ZJOI2015]幻想乡战略游戏(动态点分治,树的重心,二分查找,Tarjan-LCA,树上差分)
- 分而治之——二分查找
- 二分查找的一般实现
- 《编程珠玑》第二章2.1 二分查找不存在的数
- 4 Values whose Sum is 0 POJ - 2785(二分查找)
- 快速排序 和 二分查找
- java 实现二分查找法
- 二分查找
- 二分查找
- 二分逼近&二分查找 高效解析800万大数据之区域分布
- 3376 数据结构实验之查找四:二分查找
- 凤凰网招聘二分查找python实现
- 二分查找的灵活应用
- 二分查找:联合中位数