题目:请给出一个时间复杂度为nlogn的算法,使之能够在给定一个由n个整数的构成的整合S和另一个整数x时,判断出S中是否存在有两个其和等于x的元素。
解答:
首先对S进行排序,使用合并算法进行排序,排序算法的时间复杂度为nlogn。
然后对排序的S从左到右(即从大到小)进行算法,首先锁定一个数i,这个数小于x的一半,然后从这个数的右边开始查找x-i,使用2分法查找,算法的时间复杂度小于nlogn,所以总的时间复杂度还是nlogn。
- #include<iostream>
- constintMAXINT=0xFFFF-1;
- voidMerge(intA[],intstart,intmid,intend)
- {
- intlen1=mid-start+1+1;//加一个位置用于保存哨兵
- intlen2=end-mid+1;//加一个位置用于保存哨兵
- int*L=newint[len1];
- int*R=newint[len2];
- for(inti=0;i<len1-1;i++)
- L[i]=A[start+i];
- L[len1-1]=MAXINT;
- for(intj=0;j<len2-1;j++)
- R[j]=A[mid+j+1];
- R[len2-1]=MAXINT;
- i=0;j=0;
- for(intk=start;k<=end;k++)
- {
- if(L[i]<=R[j])
- {
- A[k]=L[i];
- i++;
- }
- else
- {
- A[k]=R[j];
- j++;
- }
- }
- }
- voidMergeSort(intA[],intstart,intend)
- {
- if(start<end)
- {
- intmid=(end+start)/2;
- MergeSort(A,start,mid);
- MergeSort(A,mid+1,end);
- Merge(A,start,mid,end);
- }
- }
- voidFind(intA[],intn,intx)
- {
- intneedValue;
- intleft,right,leftPosition,middle;
- leftPosition=0;
- intcount=0;
- while(A[leftPosition]<=x/2)
- {
- needValue=x-A[leftPosition];
- left=leftPosition+1;
- right=n-1;
- while(left<=right)
- {
- middle=(left+right)/2;
- if(A[middle]>needValue)
- right=middle-1;
- else
- if(A[middle]<needValue)
- left=middle+1;
- else
- {
- std::cout<<"the"<<++count<<":";
- std::cout<<x<<"="<<A[leftPosition]<<"+"<<needValue<<std::endl;
- inttemp;
- temp=middle;
- while(A[--temp]==needValue)
- {
- std::cout<<"the"<<++count<<":";
- std::cout<<x<<"="<<A[leftPosition]<<"+"<<needValue<<std::endl;
- }
- temp=middle;
- while(A[++temp]==needValue)
- {
- std::cout<<"the"<<count++<<":";
- std::cout<<x<<"="<<A[leftPosition]<<"+"<<needValue<<std::endl;
- }
- break;
- }
- }
- leftPosition++;
- }
- std::cout<<"thetotalnumberis"<<count<<std::endl;
- }
- intmain(void)
- {
- int*a;
- intx;
- intn;
- std::cout<<"Pleaseinputthetwonumber'ssum:"<<std::endl;
- std::cin>>x;
- std::cout<<"Pleaseinputthearray'ssize:/n";
- std::cin>>n;
- a=newint[n];
- std::cout<<"Pleaseinputthearray'value:"<<std::endl;
- for(inti=0;i<n;i++)
- std::cin>>a[i];
- MergeSort(a,0,n-1);
- std::cout<<"Thesortednumberseries:";
- for(i=0;i<n;i++)
- std::cout<<""<<a[i];
- std::cout<<std::endl<<"theresult:/n";
- Find(a,n,x);
- return0;
- }