有序数组的组合问题

题目本身引自: http://blog.csdn.net/koudaidai/article/details/8066395


一个数列 顺序排好 给一个m 求|m - n1*n2 |最小的n1 n2 ,这两个数 是这个数列里的。 

基本思路: 从头和尾各一个指针, 想中间移动.  比如头n1, 尾n2,  n1*n2 > m,   可推断n1 后面的所有值与n2乘更大于m, 所以把n2 --


源码如下:

void GetMostClose(int array[], int a_len, int m)
{
int pre_i = 0, i = 0;
int pre_j = a_len -1, j = a_len - 1;


int max_base = (1<<31)-1;
std::cout << max_base << endl;
while (j > i)
{
   int curr = array[i] * array[j];


   int diff = (m - curr);
   if (diff < 0) diff *= -1;
   if (diff < max_base)
   {
    pre_i = i;
    pre_j = j;
    max_base = diff;
   }


   else if (curr <= m)
    i++;
   else
    j--;
}
std::cout << "m=" << m << ",i=" << array[pre_i] << ",j=" << array[pre_j] << endl;
}

int main()

{

    int a[12] = {1,2,3,4,5,6,7,8,9,10,11,12};
    GetMostClose(a, sizeof(a)/sizeof(int), 49);

}

结果输出:

2147483647
m=49,i=4,j=12


  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值