在升序数组中查找和为特定值的两个数

思路,从左和右同时遍历数组,如果左右相加大于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;
}


评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值