【题目】
一个长度为n的整型数组a,给定整数x,设计一个复杂度不超过O(nlog2n)的算法,查找出这个数组中所有两两和为x的整数对并输出。
【思路】
先对该数组进行排序,可以考虑快速排序或归并排序,然后分别从数组的小端i=0和大端j=n-1开始,将两数相加,若和大于x,则大端前移j–,若小于x则小端后移i++,相等则输出两个数,直至i>=j。
#include <iostream>
#include <algorithm>
#define MAX 100
using namespace std;
int main()
{
int i,j,n,x,a[MAX];
bool f=false;
cout<<"输入n:";
cin>>n;
cout<<"输入数组:";
for(i=0;i<n;i++)
cin>>a[i];
sort(a,a+n); //快速排序
cout<<"输入x:";
cin>>x;
i=0; //第一个元素
j=n-1; //最后一个元素
while(i<j)
{
if(a[i]+a[j]==x)
{
f=true; //找到整数对
cout<<a[i]<<" "<<a[j]<<endl;
i++;
j--;
}
else if(a[i]+a[j]>x)
j--; //j前移
else
i++; //i后移
}
if(!f)
cout<<"不存在和为x的整数对!";
return 0;
}
【结果】