首先对数组进行排序,时间复杂度为(N*log2N)。
然后令i = 0,j = n-1,看arr[i] + arr[j] 是否等于Sum,如果是,则结束。如果小于Sum,则i = i + 1;如果大于Sum,则 j = j – 1。这样只需要在排好序的数组上遍历一次,就可以得到最后的结果,时间复杂度为O(N)。两步加起来总的时间复杂度O(N*log2N),下面这个程序就利用了这个思想,代码如下所示:
#include<iostream>
#include<algorithm>
using namespace std;
vector<pair<int,int>> vec;
void getsum(int arr[],int n,int sum){
for(int i=0,j=n-1;i<j;){
if(arr[i]+arr[j] == sum)
{
int a = arr[i];
int b = arr[j];
vec.push_back(pair<int,int>(a,b));
i++;
j--;
}else if(arr[i]+arr[j] <sum)
i++;
else
j--;
}
}
int main(){
int arr[12] = {45,67,23,87,32,87,34,78,65,54,12,43};
sort(begin(arr),end(arr));
int sum;
cin>>sum;
getsum(arr,12,sum);
for(int i=0;i<vec.size();i++)
cout<<vec[i].first<<" "<<vec[i].second<<endl;
return 0;
}