输入n ( n

问题内容

输入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
#include
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;iif(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(zif(a[z]==a[mid]){
                                flag[z]=1;
                                flag[i]=1;
                                cout<<"     ("<","<")        ("<","<")"<break;
                            }
                            z++;
                        }
                    }else{
                        flag[mid]=1;
                        flag[i]=1;
                        cout<<"     ("<","<")        ("<","<")"<break;              
                }else if(y>a[mid]){
                    l=mid+1;
                }else if(y1;
                }
            }
        }
        if(flag[i]==0){
            cout<<"The element "<" whose index is "<" cannot match another element"<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:"<sizeof(int),cmp);

    for(int i=0;icout<" ";
    }

    cout<"array subscript element value"<return 0;
}

运行结果

输入n ( n_第1张图片

你可能感兴趣的:(输入n ( n)