集合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;}