#include <iostream>
#include <algorithm>
using namespace std;
int binarysearch(int key,int a[],int hi)
{
int lo=0;
while(lo<=hi)
{
int mid=lo+(hi-lo)/2;
if(key<a[mid]) hi=mid-1;
else if(key>a[mid]) lo=mid+1;
else
return mid;
}
return -1;
}
void main()
{
int a[10]={-1,2,4,0,-2,8,-3,1,5,3};
int hi=sizeof(a)/sizeof(int);
sort(a,a+hi);
int cnt=0;
for(int i=0;i<hi;i++)
{
for(int j=i;j<hi;j++)
{
int k=binarysearch(-a[i]-a[j],a,hi);
if(k>j)
{
cout<<a[i]<<" "<<a[j]<<" "<<a[k]<<endl;
++cnt;
}
}
}
if(cnt==0)
cout<<"no"<<endl;
system("pause");
}
3-sum问题的复杂度大概是N^2 logN,自己实现了一下,和2-sum的问题方法类似。
#include <iostream>
#include <algorithm>
using namespace std;
void search(int key,int a[],int hi)
{
int lo=0;
int cnt=0;
while((hi-lo)>1)//此处不写lo<hi,防止a[lo]和a[hi]指向同一个数
{
if(a[lo]+a[hi]<key) lo++;
else if(a[lo]+a[hi]>key) hi--;
else
{
cout<<-key<<" "<<a[lo]<<" "<<a[hi]<<endl;
cnt++;lo++;hi--;
}
}
if(cnt==0)
cout<<"no"<<endl;
}
void main()
{
int a[10]={-2,-1,0,1,2,9,8,7,6,5};
int hi=sizeof(a)/sizeof(int);
sort(a,a+hi);
for(int i=0;i<hi;i++)
{
search(-a[i],a,hi-1);
}
system("pause");
}
此法复杂度为N^2,但是会重复输出符合条件的三个数