思路,从左和右同时遍历数组,如果左右相加大于n,则说明右边的值偏大,则右指针左移;如果比n小,则左指针右移;总共对数组只需要遍历一遍。
/*在一个升序数组中查找两个数,使得他们的和为已知数n,时间复杂度O(n)*/
/*返回距离最近的一对*/
int* Find(int *array , int len , int n)
{
int *re = new int[2];
int left = 0;
int right = len - 1;
int maxLeft , minRight;
int minDis = len;
while( left < right )
{
if( array[left]+array[right] > n ) --right;
if( array[left]+array[right] < n ) ++left;
if( array[left]+array[right] == n )
{
if( right-left < minDis )
{
maxLeft = left;
minRight = right;
minDis = right - left;
}
if( array[left] != array[left+1] ) ++left;
else if( array[right] != array[right-1] )--right;
else {++left;--right;}
}
}
if( minDis == len )
{
delete[] re;
return 0;
}
re[0] = array[maxLeft];
re[1] = array[minRight];
return re;
}