思路,从左和右同时遍历数组,如果左右相加大于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;
}
本文介绍了一种在升序数组中寻找两数之和等于特定值N的方法,采用双指针技术实现O(n)的时间复杂度。通过左右指针的移动,找到最接近目标值的数对。

被折叠的 条评论
为什么被折叠?



