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

问题内容

输入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;
}

运行结果

这里写图片描述

猜你喜欢

转载自blog.csdn.net/a_chen666/article/details/77618687