输入n ( n<= 100,000)个整数,找出其中的两 肯定有解)。题中所有整数都能用 int 表示

来源:互联网 发布:股票主力分析软件 编辑:程序博客网 时间:2024/06/05 11:26

问题内容

输入n ( n<= 100,000)个整数,找出其中的两个数,它们之和等于整数m(假定
肯定有解)。题中所有整数都能用 int 表示

问题分析

1) 将数组排序,复杂度是O(n×log(n))
2) 对数组中的每个元素a[i],在数组中二分查找m-a[i],看
,最坏要查找n-2次,所以查找这部分的复杂度也是O(n

这种解法总的复杂度是O(n×log(n))的。

算法实现

/*输入n ( n<= 100,000)个整数,找出其中的两个数,它们之和等于整数m(假定肯定有解)。题中所有整数都能用 int 表示*//*将数组排序,复杂度是O(n×log(n))对数组中的每个元素a[i],在数组中二分查找m-a[i],看能否找到。复杂度log(n),最坏要查找n-2次,所以查找这部分的复杂度也是O(n×log(n))*//*考虑了数组中元素值重复的问题,已经被选取的元素不能重复选取,引入数组flag做标记,具体看程序  */#include<stdlib.h>#include<iostream>using namespace std;int i=0;int cmp(const void *a,const void *b){    return *(int*)a-*(int*)b;}void SolveQ(int a[],int n,int m){    int l=0,r=0;    int mid=0;    int flag[100]={0};    int y=0;    int z=0;    for(i=0;i<n;i++){        y=m-a[i];        if(flag[i]==0){            l=i+1;r=n-1;            while(l<=r){                mid=l+(r-l)/2;                if(y==a[mid]){                    if(flag[mid]==1){                        z=mid+1;                        while(z<n){                            if(a[z]==a[mid]){                                flag[z]=1;                                flag[i]=1;                                cout<<"     ("<<i<<","<<z<<")        ("<<a[i]<<","<<y<<")"<<endl;                                break;                            }                            z++;                        }                    }else{                        flag[mid]=1;                        flag[i]=1;                        cout<<"     ("<<i<<","<<mid<<")        ("<<a[i]<<","<<y<<")"<<endl;                    }                       break;                              }else if(y>a[mid]){                    l=mid+1;                }else if(y<a[mid]){                    r=mid-1;                }            }        }        if(flag[i]==0){            cout<<"The element "<<a[i]<<" whose index is "<<i<<" cannot match another element"<<endl;        }        flag[i]=1;    }}int main(){    int a[6]={0,0,0,1,0,0};     int n=sizeof(a)/sizeof(a[0]);    int m=0;    cout<<"sorted array:"<<endl;     qsort(a,n,sizeof(int),cmp);    for(int i=0;i<n;i++){        cout<<a[i]<<" ";    }    cout<<endl<<"array subscript element value"<<endl;     SolveQ(a,n,m);      return 0;}

运行结果

这里写图片描述

阅读全文
0 0
原创粉丝点击