给定一个整数sum,从有N个有序元素的数组中寻找元素a、b,使得 a+b 的结果最接近sum,最快的平均时间复杂度是O(N)。
实现代码链接:http://blog.csdn.net/wyh7280/article/details/44941289
下面给出时间复杂度为O(NlogN)的,采用折半方法搜索最接近的值~
代码如下:
#include<iostream>
#include<stdlib.h>
#include<stdio.h>
using namespace std;
const int N=20; //该程序中给定了数组长度和数组里面的有序变量,需要修改也很简单,请自行进行
int array[N]={1,3,5,7,9,12,24,56,78,90,100,120,123,134,156,189,200,201,202,204};
int search(int targetNum) //折半查找函数
{
int left = 0, right = N-1;
while(left<=right)
{
int midIndex =(right+left)/2;
int mid=right-left;
int midValue =array[midIndex];
if (targetNum == midValue)
{
return midIndex;
}
else if (targetNum > midValue)
{
left = midIndex;
}
else
{
right = midIndex;
}
if(mid<=1)
{
break;
}
}
}
int main(void)
{
int sum;
while(scanf("%d",&sum)==1)
{
int a=array[0],b=array[N-1],temp=array[0]+array[N-1]-sum;
if(array[0]+array[0]>=sum)
{
continue;
}
if(temp<0)
temp=-temp;
for(int i=0;i<N;i++)
{
int bb=search(sum-array[i]);
int te=array[i]+array[bb]-sum;
if(te<0) te=-te;
if(te==0)
{
a=array[i];
b=array[bb];
break;
}
if(te<temp&&bb!=i)
{
temp=te;
a=array[i];
b=array[bb];
}
}
if(a<b)
cout<<a<<" "<<b<<endl;
if(a>b)
cout<<b<<" "<<a<<endl;
}
return 0;
}