练习 2.3-7 求一个元素是否为数组中两个数的和

来源:互联网 发布:淘宝开店 商标 随便 编辑:程序博客网 时间:2024/05/17 00:51

题目:
给出一个O(nlgn)的算法,使之能在给定一个由n个整数构成的集合S和另一个整数x时,判断S中是否存在有两个其和等于x的元素。
思路:
首先采用合并排序算法对数组进行从小到大排序(复杂度为O(nlgn))
然后从左→右扫描数组S(时间复杂度为O(n)),对每个a[i],在数组中用二分查找算法寻找v-a[i](时间复杂度为O(lgn)),则总时间复杂度为O(nlgn)

#include <iostream>#include <vector>using namespace std;void merge(vector<int> &ivec,int p,int q,int r){int nl=q-p+1;int nr=r-q;int *L=new int[nl];int *R=new int[nr];for(int i=0;i<nl;i++)L[i]=ivec[p+i];for(int j=0;j<nr;j++)R[j]=ivec[q+1+j];int m=0,n=0;for(int k=p;k<=r;k++){if(m<nl && n<nr)ivec[k]=L[m]<R[n]?L[m++]:R[n++];else if(m<nl)ivec[k]=L[m++];elseivec[k]=R[n++];}delete []L;delete []R;}void mergeSort(vector<int> &ivec,int p,int r){if(p<r){int q=(p+r)/2;mergeSort(ivec,p,q);mergeSort(ivec,q+1,r);merge(ivec,p,q,r);}}int main(){cout<<"enter a list of numbers(ctrl+z to end):"<<endl;int val;vector<int> ivec;while(cin>>val)ivec.push_back(val);cout<<"enter a number that be the sum of two elements in the list:"<<endl;int sum;cin.clear();cin.sync();cin>>sum;//先合并排序,时间O(nlgn)mergeSort(ivec,0,ivec.size()-1);//再查找int flag=0;int i=0,j=ivec.size()-1;while(i<j){int k=ivec[i]+ivec[j];if(k==sum){flag=1;break;}else if(k<sum)i++;elsej--;}if(flag)cout<<"存在"<<ivec[i]<<"+"<<ivec[j]<<"="<<sum<<endl;elsecout<<"数组中不存在两个数的和等于"<<sum<<endl;return 0;}


原创粉丝点击